Search in sources :

Example 1 with MLTransactionLogImpl

use of org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl in project pulsar by apache.

the class ManagedLedgerMetricsTest method testTransactionTopic.

@Test
public void testTransactionTopic() throws Exception {
    admin.tenants().createTenant(NamespaceName.SYSTEM_NAMESPACE.getTenant(), new TenantInfoImpl(Sets.newHashSet("appid1"), Sets.newHashSet("test")));
    admin.namespaces().createNamespace(NamespaceName.SYSTEM_NAMESPACE.toString());
    admin.topics().createPartitionedTopic(TopicName.TRANSACTION_COORDINATOR_ASSIGN.toString(), 1);
    ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig();
    managedLedgerConfig.setMaxEntriesPerLedger(2);
    new MLTransactionLogImpl(TransactionCoordinatorID.get(0), pulsar.getManagedLedgerFactory(), managedLedgerConfig).initialize().join();
    ManagedLedgerMetrics metrics = new ManagedLedgerMetrics(pulsar);
    metrics.generate();
}
Also used : ManagedLedgerMetrics(org.apache.pulsar.broker.stats.metrics.ManagedLedgerMetrics) ManagedLedgerConfig(org.apache.bookkeeper.mledger.ManagedLedgerConfig) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) MLTransactionLogImpl(org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl) Test(org.testng.annotations.Test)

Example 2 with MLTransactionLogImpl

use of org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl in project pulsar by apache.

the class MLTransactionMetadataStoreTest method testRecoverSequenceId.

@Test(dataProvider = "isUseManagedLedgerProperties")
public void testRecoverSequenceId(boolean isUseManagedLedgerProperties) throws Exception {
    ManagedLedgerFactoryConfig factoryConf = new ManagedLedgerFactoryConfig();
    factoryConf.setMaxCacheSize(0);
    @Cleanup("shutdown") ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(metadataStore, bkc, factoryConf);
    TransactionCoordinatorID transactionCoordinatorID = new TransactionCoordinatorID(1);
    ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig();
    MLTransactionSequenceIdGenerator mlTransactionSequenceIdGenerator = new MLTransactionSequenceIdGenerator();
    managedLedgerConfig.setManagedLedgerInterceptor(mlTransactionSequenceIdGenerator);
    managedLedgerConfig.setMaxEntriesPerLedger(3);
    MLTransactionLogImpl mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    MLTransactionMetadataStore transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    Awaitility.await().until(transactionMetadataStore::checkIfReady);
    TxnID txnID = transactionMetadataStore.newTransaction(20000).get();
    transactionMetadataStore.updateTxnStatus(txnID, TxnStatus.COMMITTING, TxnStatus.OPEN, false).get();
    if (isUseManagedLedgerProperties) {
        transactionMetadataStore.updateTxnStatus(txnID, TxnStatus.COMMITTED, TxnStatus.COMMITTING, false).get();
    }
    assertEquals(txnID.getLeastSigBits(), 0);
    Field field = MLTransactionLogImpl.class.getDeclaredField("managedLedger");
    field.setAccessible(true);
    ManagedLedgerImpl managedLedger = (ManagedLedgerImpl) field.get(mlTransactionLog);
    Position position = managedLedger.getLastConfirmedEntry();
    if (isUseManagedLedgerProperties) {
        Awaitility.await().until(() -> {
            managedLedger.rollCurrentLedgerIfFull();
            return !managedLedger.ledgerExists(position.getLedgerId());
        });
    }
    mlTransactionLog.closeAsync().get();
    mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    Awaitility.await().until(transactionMetadataStore::checkIfReady);
    txnID = transactionMetadataStore.newTransaction(100000).get();
    assertEquals(txnID.getLeastSigBits(), 1);
}
Also used : ManagedLedgerFactoryConfig(org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig) Position(org.apache.bookkeeper.mledger.Position) MLTransactionSequenceIdGenerator(org.apache.pulsar.transaction.coordinator.impl.MLTransactionSequenceIdGenerator) Cleanup(lombok.Cleanup) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) MLTransactionLogImpl(org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl) Field(java.lang.reflect.Field) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) TxnID(org.apache.pulsar.client.api.transaction.TxnID) ManagedLedgerFactory(org.apache.bookkeeper.mledger.ManagedLedgerFactory) ManagedLedgerConfig(org.apache.bookkeeper.mledger.ManagedLedgerConfig) ManagedLedgerFactoryImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl) Test(org.testng.annotations.Test)

Example 3 with MLTransactionLogImpl

use of org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl in project pulsar by apache.

the class MLTransactionMetadataStoreTest method testManageLedgerWriteFailState.

@Test
public void testManageLedgerWriteFailState() throws Exception {
    ManagedLedgerFactoryConfig factoryConf = new ManagedLedgerFactoryConfig();
    factoryConf.setMaxCacheSize(0);
    @Cleanup("shutdown") ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(metadataStore, bkc, factoryConf);
    TransactionCoordinatorID transactionCoordinatorID = new TransactionCoordinatorID(1);
    ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig();
    MLTransactionSequenceIdGenerator mlTransactionSequenceIdGenerator = new MLTransactionSequenceIdGenerator();
    managedLedgerConfig.setManagedLedgerInterceptor(mlTransactionSequenceIdGenerator);
    MLTransactionLogImpl mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    MLTransactionMetadataStore transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    Awaitility.await().until(transactionMetadataStore::checkIfReady);
    transactionMetadataStore.newTransaction(5000).get();
    Field field = MLTransactionLogImpl.class.getDeclaredField("managedLedger");
    field.setAccessible(true);
    ManagedLedgerImpl managedLedger = (ManagedLedgerImpl) field.get(mlTransactionLog);
    field = ManagedLedgerImpl.class.getDeclaredField("STATE_UPDATER");
    field.setAccessible(true);
    AtomicReferenceFieldUpdater state = (AtomicReferenceFieldUpdater) field.get(managedLedger);
    state.set(managedLedger, WriteFailed);
    try {
        transactionMetadataStore.newTransaction(5000).get();
        fail();
    } catch (ExecutionException e) {
        assertTrue(e.getCause() instanceof ManagedLedgerException.ManagedLedgerAlreadyClosedException);
    }
    transactionMetadataStore.newTransaction(5000).get();
}
Also used : ManagedLedgerFactoryConfig(org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig) MLTransactionSequenceIdGenerator(org.apache.pulsar.transaction.coordinator.impl.MLTransactionSequenceIdGenerator) Cleanup(lombok.Cleanup) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) MLTransactionLogImpl(org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl) AtomicReferenceFieldUpdater(java.util.concurrent.atomic.AtomicReferenceFieldUpdater) Field(java.lang.reflect.Field) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) ManagedLedgerFactory(org.apache.bookkeeper.mledger.ManagedLedgerFactory) ManagedLedgerConfig(org.apache.bookkeeper.mledger.ManagedLedgerConfig) ExecutionException(java.util.concurrent.ExecutionException) ManagedLedgerFactoryImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl) Test(org.testng.annotations.Test)

Example 4 with MLTransactionLogImpl

use of org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl in project pulsar by apache.

the class MLTransactionMetadataStoreTest method testRecoverWhenDeleteFromCursor.

@Test
public void testRecoverWhenDeleteFromCursor() throws Exception {
    ManagedLedgerFactoryConfig factoryConf = new ManagedLedgerFactoryConfig();
    factoryConf.setMaxCacheSize(0);
    @Cleanup("shutdown") ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(metadataStore, bkc, factoryConf);
    TransactionCoordinatorID transactionCoordinatorID = new TransactionCoordinatorID(1);
    ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig();
    MLTransactionSequenceIdGenerator mlTransactionSequenceIdGenerator = new MLTransactionSequenceIdGenerator();
    managedLedgerConfig.setManagedLedgerInterceptor(mlTransactionSequenceIdGenerator);
    MLTransactionLogImpl mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    MLTransactionMetadataStore transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    Awaitility.await().until(transactionMetadataStore::checkIfReady);
    // txnID1 have not deleted from cursor, we can recover from transaction log
    TxnID txnID1 = transactionMetadataStore.newTransaction(1000).get();
    // txnID2 have deleted from cursor.
    TxnID txnID2 = transactionMetadataStore.newTransaction(1000).get();
    transactionMetadataStore.updateTxnStatus(txnID2, TxnStatus.ABORTING, TxnStatus.OPEN, false).get();
    transactionMetadataStore.updateTxnStatus(txnID2, TxnStatus.ABORTED, TxnStatus.ABORTING, false).get();
    mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    Awaitility.await().until(transactionMetadataStore::checkIfReady);
}
Also used : ManagedLedgerFactoryConfig(org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig) MLTransactionSequenceIdGenerator(org.apache.pulsar.transaction.coordinator.impl.MLTransactionSequenceIdGenerator) Cleanup(lombok.Cleanup) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) MLTransactionLogImpl(org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl) TxnID(org.apache.pulsar.client.api.transaction.TxnID) ManagedLedgerFactory(org.apache.bookkeeper.mledger.ManagedLedgerFactory) ManagedLedgerConfig(org.apache.bookkeeper.mledger.ManagedLedgerConfig) ManagedLedgerFactoryImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl) Test(org.testng.annotations.Test)

Example 5 with MLTransactionLogImpl

use of org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl in project pulsar by yahoo.

the class MLTransactionMetadataStoreTest method testTransactionOperation.

@Test
public void testTransactionOperation() throws Exception {
    ManagedLedgerFactoryConfig factoryConf = new ManagedLedgerFactoryConfig();
    factoryConf.setMaxCacheSize(0);
    @Cleanup("shutdown") ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(metadataStore, bkc, factoryConf);
    TransactionCoordinatorID transactionCoordinatorID = new TransactionCoordinatorID(1);
    ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig();
    MLTransactionSequenceIdGenerator mlTransactionSequenceIdGenerator = new MLTransactionSequenceIdGenerator();
    managedLedgerConfig.setManagedLedgerInterceptor(mlTransactionSequenceIdGenerator);
    MLTransactionLogImpl mlTransactionLog = new MLTransactionLogImpl(transactionCoordinatorID, factory, managedLedgerConfig);
    mlTransactionLog.initialize().join();
    MLTransactionMetadataStore transactionMetadataStore = new MLTransactionMetadataStore(transactionCoordinatorID, mlTransactionLog, new TransactionTimeoutTrackerImpl(), new TransactionRecoverTrackerImpl(), mlTransactionSequenceIdGenerator);
    int checkReplayRetryCount = 0;
    while (true) {
        checkReplayRetryCount++;
        if (checkReplayRetryCount > 3) {
            fail();
            break;
        }
        if (transactionMetadataStore.checkIfReady()) {
            TxnID txnID = transactionMetadataStore.newTransaction(5000).get();
            assertEquals(transactionMetadataStore.getTxnStatus(txnID).get(), TxnStatus.OPEN);
            List<String> partitions = new ArrayList<>();
            partitions.add("pt-1");
            partitions.add("pt-2");
            transactionMetadataStore.addProducedPartitionToTxn(txnID, partitions).get();
            assertEquals(transactionMetadataStore.getTxnMeta(txnID).get().producedPartitions(), partitions);
            partitions.add("pt-3");
            transactionMetadataStore.addProducedPartitionToTxn(txnID, partitions).get();
            assertEquals(transactionMetadataStore.getTxnMeta(txnID).get().producedPartitions(), partitions);
            List<TransactionSubscription> subscriptions = new ArrayList<>();
            subscriptions.add(new TransactionSubscription("topic1", "sub1"));
            subscriptions.add(new TransactionSubscription("topic2", "sub2"));
            transactionMetadataStore.addAckedPartitionToTxn(txnID, subscriptions).get();
            Assert.assertTrue(transactionMetadataStore.getTxnMeta(txnID).get().ackedPartitions().containsAll(subscriptions));
            transactionMetadataStore.addAckedPartitionToTxn(txnID, subscriptions).get();
            assertEquals(transactionMetadataStore.getTxnMeta(txnID).get().producedPartitions(), partitions);
            transactionMetadataStore.updateTxnStatus(txnID, TxnStatus.COMMITTING, TxnStatus.OPEN, false).get();
            Assert.assertEquals(transactionMetadataStore.getTxnStatus(txnID).get(), TxnStatus.COMMITTING);
            transactionMetadataStore.updateTxnStatus(txnID, TxnStatus.COMMITTED, TxnStatus.COMMITTING, false).get();
            try {
                transactionMetadataStore.getTxnMeta(txnID).get();
                fail();
            } catch (ExecutionException e) {
                Assert.assertTrue(e.getCause() instanceof TransactionNotFoundException);
            }
            break;
        } else {
            checkReplayRetryCount++;
            Thread.sleep(100);
        }
    }
}
Also used : ManagedLedgerFactoryConfig(org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig) MLTransactionSequenceIdGenerator(org.apache.pulsar.transaction.coordinator.impl.MLTransactionSequenceIdGenerator) ArrayList(java.util.ArrayList) TransactionNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException) Cleanup(lombok.Cleanup) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) MLTransactionLogImpl(org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl) TxnID(org.apache.pulsar.client.api.transaction.TxnID) ManagedLedgerFactory(org.apache.bookkeeper.mledger.ManagedLedgerFactory) ManagedLedgerConfig(org.apache.bookkeeper.mledger.ManagedLedgerConfig) ExecutionException(java.util.concurrent.ExecutionException) ManagedLedgerFactoryImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl) Test(org.testng.annotations.Test)

Aggregations

MLTransactionLogImpl (org.apache.pulsar.transaction.coordinator.impl.MLTransactionLogImpl)26 Test (org.testng.annotations.Test)26 MLTransactionMetadataStore (org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore)23 ManagedLedgerConfig (org.apache.bookkeeper.mledger.ManagedLedgerConfig)21 MLTransactionSequenceIdGenerator (org.apache.pulsar.transaction.coordinator.impl.MLTransactionSequenceIdGenerator)21 Cleanup (lombok.Cleanup)18 ManagedLedgerFactory (org.apache.bookkeeper.mledger.ManagedLedgerFactory)18 ManagedLedgerFactoryConfig (org.apache.bookkeeper.mledger.ManagedLedgerFactoryConfig)18 ManagedLedgerFactoryImpl (org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl)18 TxnID (org.apache.pulsar.client.api.transaction.TxnID)15 Field (java.lang.reflect.Field)14 ArrayList (java.util.ArrayList)9 ExecutionException (java.util.concurrent.ExecutionException)9 ManagedCursor (org.apache.bookkeeper.mledger.ManagedCursor)6 ManagedLedgerImpl (org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl)6 TransactionNotFoundException (org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException)6 TransactionCoordinatorID (org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID)5 HashMap (java.util.HashMap)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 AtomicReferenceFieldUpdater (java.util.concurrent.atomic.AtomicReferenceFieldUpdater)3