Search in sources :

Example 1 with TxnMeta

use of org.apache.pulsar.transaction.coordinator.TxnMeta in project pulsar by apache.

the class TransactionsBase method internalGetSlowTransactions.

protected void internalGetSlowTransactions(AsyncResponse asyncResponse, boolean authoritative, long timeout, Integer coordinatorId) {
    try {
        if (pulsar().getConfig().isTransactionCoordinatorEnabled()) {
            if (coordinatorId != null) {
                validateTopicOwnership(TopicName.TRANSACTION_COORDINATOR_ASSIGN.getPartition(coordinatorId), authoritative);
                TransactionMetadataStore transactionMetadataStore = pulsar().getTransactionMetadataStoreService().getStores().get(TransactionCoordinatorID.get(coordinatorId));
                if (transactionMetadataStore == null) {
                    asyncResponse.resume(new RestException(NOT_FOUND, "Transaction coordinator not found! coordinator id : " + coordinatorId));
                    return;
                }
                List<TxnMeta> transactions = transactionMetadataStore.getSlowTransactions(timeout);
                List<CompletableFuture<TransactionMetadata>> completableFutures = new ArrayList<>();
                for (TxnMeta txnMeta : transactions) {
                    CompletableFuture<TransactionMetadata> completableFuture = new CompletableFuture<>();
                    getTransactionMetadata(txnMeta, completableFuture);
                    completableFutures.add(completableFuture);
                }
                FutureUtil.waitForAll(completableFutures).whenComplete((v, e) -> {
                    if (e != null) {
                        asyncResponse.resume(new RestException(e.getCause()));
                        return;
                    }
                    Map<String, TransactionMetadata> transactionMetadata = new HashMap<>();
                    for (CompletableFuture<TransactionMetadata> future : completableFutures) {
                        try {
                            transactionMetadata.put(future.get().txnId, future.get());
                        } catch (Exception exception) {
                            asyncResponse.resume(new RestException(exception.getCause()));
                            return;
                        }
                    }
                    asyncResponse.resume(transactionMetadata);
                });
            } else {
                getPartitionedTopicMetadataAsync(TopicName.TRANSACTION_COORDINATOR_ASSIGN, false, false).thenAccept(partitionMetadata -> {
                    if (partitionMetadata.partitions == 0) {
                        asyncResponse.resume(new RestException(Response.Status.NOT_FOUND, "Transaction coordinator not found"));
                        return;
                    }
                    List<CompletableFuture<Map<String, TransactionMetadata>>> completableFutures = Lists.newArrayList();
                    for (int i = 0; i < partitionMetadata.partitions; i++) {
                        try {
                            completableFutures.add(pulsar().getAdminClient().transactions().getSlowTransactionsByCoordinatorIdAsync(i, timeout, TimeUnit.MILLISECONDS));
                        } catch (PulsarServerException e) {
                            asyncResponse.resume(new RestException(e));
                            return;
                        }
                    }
                    Map<String, TransactionMetadata> transactionMetadataMaps = new HashMap<>();
                    FutureUtil.waitForAll(completableFutures).whenComplete((result, e) -> {
                        if (e != null) {
                            asyncResponse.resume(new RestException(e));
                            return;
                        }
                        for (CompletableFuture<Map<String, TransactionMetadata>> transactionMetadataMap : completableFutures) {
                            try {
                                transactionMetadataMaps.putAll(transactionMetadataMap.get());
                            } catch (Exception exception) {
                                asyncResponse.resume(new RestException(exception.getCause()));
                                return;
                            }
                        }
                        asyncResponse.resume(transactionMetadataMaps);
                    });
                }).exceptionally(ex -> {
                    log.error("[{}] Failed to get transaction coordinator state.", clientAppId(), ex);
                    resumeAsyncResponseExceptionally(asyncResponse, ex);
                    return null;
                });
            }
        } else {
            asyncResponse.resume(new RestException(SERVICE_UNAVAILABLE, "Broker don't support transaction!"));
        }
    } catch (Exception e) {
        asyncResponse.resume(new RestException(e));
    }
}
Also used : ServiceUnitNotReadyException(org.apache.pulsar.broker.service.BrokerServiceException.ServiceUnitNotReadyException) TransactionMetadataStore(org.apache.pulsar.transaction.coordinator.TransactionMetadataStore) TopicName(org.apache.pulsar.common.naming.TopicName) Topic(org.apache.pulsar.broker.service.Topic) TransactionCoordinatorStats(org.apache.pulsar.common.policies.data.TransactionCoordinatorStats) AdminResource(org.apache.pulsar.broker.admin.AdminResource) NotAllowedException(org.apache.pulsar.broker.service.BrokerServiceException.NotAllowedException) TransactionLogStats(org.apache.pulsar.common.policies.data.TransactionLogStats) METHOD_NOT_ALLOWED(javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) ArrayList(java.util.ArrayList) TxnID(org.apache.pulsar.client.api.transaction.TxnID) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) Lists(com.google.common.collect.Lists) ManagedLedger(org.apache.bookkeeper.mledger.ManagedLedger) Map(java.util.Map) RestException(org.apache.pulsar.broker.web.RestException) NamespaceName(org.apache.pulsar.common.naming.NamespaceName) TopicDomain(org.apache.pulsar.common.naming.TopicDomain) TransactionInBufferStats(org.apache.pulsar.common.policies.data.TransactionInBufferStats) CoordinatorNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.CoordinatorNotFoundException) SERVICE_UNAVAILABLE(javax.ws.rs.core.Response.Status.SERVICE_UNAVAILABLE) BAD_REQUEST(javax.ws.rs.core.Response.Status.BAD_REQUEST) TransactionMetadata(org.apache.pulsar.common.policies.data.TransactionMetadata) TEMPORARY_REDIRECT(javax.ws.rs.core.Response.Status.TEMPORARY_REDIRECT) NOT_FOUND(javax.ws.rs.core.Response.Status.NOT_FOUND) AsyncResponse(javax.ws.rs.container.AsyncResponse) Transactions(org.apache.pulsar.client.admin.Transactions) SubscriptionNotFoundException(org.apache.pulsar.broker.service.BrokerServiceException.SubscriptionNotFoundException) TransactionNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException) ExecutionException(java.util.concurrent.ExecutionException) TimeUnit(java.util.concurrent.TimeUnit) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta) List(java.util.List) Slf4j(lombok.extern.slf4j.Slf4j) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) FutureUtil(org.apache.pulsar.common.util.FutureUtil) TransactionCoordinatorInternalStats(org.apache.pulsar.common.policies.data.TransactionCoordinatorInternalStats) Response(javax.ws.rs.core.Response) TransactionPendingAckInternalStats(org.apache.pulsar.common.policies.data.TransactionPendingAckInternalStats) PulsarServerException(org.apache.pulsar.broker.PulsarServerException) Codec(org.apache.pulsar.common.util.Codec) Optional(java.util.Optional) TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) TransactionInPendingAckStats(org.apache.pulsar.common.policies.data.TransactionInPendingAckStats) PulsarServerException(org.apache.pulsar.broker.PulsarServerException) HashMap(java.util.HashMap) RestException(org.apache.pulsar.broker.web.RestException) ArrayList(java.util.ArrayList) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta) ServiceUnitNotReadyException(org.apache.pulsar.broker.service.BrokerServiceException.ServiceUnitNotReadyException) NotAllowedException(org.apache.pulsar.broker.service.BrokerServiceException.NotAllowedException) RestException(org.apache.pulsar.broker.web.RestException) CoordinatorNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.CoordinatorNotFoundException) SubscriptionNotFoundException(org.apache.pulsar.broker.service.BrokerServiceException.SubscriptionNotFoundException) TransactionNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException) ExecutionException(java.util.concurrent.ExecutionException) PulsarServerException(org.apache.pulsar.broker.PulsarServerException) TransactionMetadata(org.apache.pulsar.common.policies.data.TransactionMetadata) CompletableFuture(java.util.concurrent.CompletableFuture) ArrayList(java.util.ArrayList) List(java.util.List) TransactionMetadataStore(org.apache.pulsar.transaction.coordinator.TransactionMetadataStore) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with TxnMeta

use of org.apache.pulsar.transaction.coordinator.TxnMeta in project pulsar by apache.

the class TransactionMetadataStoreServiceTest method testTimeoutTrackerMultiThreading.

@Test
public void testTimeoutTrackerMultiThreading() throws Exception {
    pulsar.getTransactionMetadataStoreService().handleTcClientConnect(TransactionCoordinatorID.get(0));
    Awaitility.await().until(() -> pulsar.getTransactionMetadataStoreService().getStores().get(TransactionCoordinatorID.get(0)) != null);
    MLTransactionMetadataStore transactionMetadataStore = (MLTransactionMetadataStore) pulsar.getTransactionMetadataStoreService().getStores().get(TransactionCoordinatorID.get(0));
    checkTransactionMetadataStoreReady(transactionMetadataStore);
    Field field = MLTransactionMetadataStore.class.getDeclaredField("txnMetaMap");
    field.setAccessible(true);
    ConcurrentSkipListMap<Long, Pair<TxnMeta, List<Position>>> txnMap = (ConcurrentSkipListMap<Long, Pair<TxnMeta, List<Position>>>) field.get(transactionMetadataStore);
    new Thread(() -> {
        int i = -1;
        while (++i < 100) {
            try {
                transactionMetadataStore.newTransaction(1000);
            } catch (Exception e) {
            // no operation
            }
        }
    }).start();
    new Thread(() -> {
        int i = -1;
        while (++i < 100) {
            try {
                transactionMetadataStore.newTransaction(2000);
            } catch (Exception e) {
            // no operation
            }
        }
    }).start();
    new Thread(() -> {
        int i = -1;
        while (++i < 100) {
            try {
                transactionMetadataStore.newTransaction(3000);
            } catch (Exception e) {
            // no operation
            }
        }
    }).start();
    new Thread(() -> {
        int i = -1;
        while (++i < 100) {
            try {
                transactionMetadataStore.newTransaction(4000);
            } catch (Exception e) {
            // no operation
            }
        }
    }).start();
    checkoutTimeout(txnMap, 300);
    checkoutTimeout(txnMap, 200);
    checkoutTimeout(txnMap, 100);
    checkoutTimeout(txnMap, 0);
}
Also used : Field(java.lang.reflect.Field) ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) Position(org.apache.bookkeeper.mledger.Position) ArrayList(java.util.ArrayList) List(java.util.List) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) TimeoutException(java.util.concurrent.TimeoutException) CoordinatorException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException) ExecutionException(java.util.concurrent.ExecutionException) Pair(org.apache.commons.lang3.tuple.Pair) Test(org.testng.annotations.Test)

Example 3 with TxnMeta

use of org.apache.pulsar.transaction.coordinator.TxnMeta in project pulsar by apache.

the class TransactionMetadataStoreServiceTest method testAddAckedPartitionToTxn.

@Test
public void testAddAckedPartitionToTxn() throws Exception {
    TransactionMetadataStoreService transactionMetadataStoreService = pulsar.getTransactionMetadataStoreService();
    transactionMetadataStoreService.handleTcClientConnect(TransactionCoordinatorID.get(0)).get();
    Awaitility.await().until(() -> transactionMetadataStoreService.getStores().size() == 1);
    MLTransactionMetadataStore transactionMetadataStore = (MLTransactionMetadataStore) pulsar.getTransactionMetadataStoreService().getStores().get(TransactionCoordinatorID.get(0));
    checkTransactionMetadataStoreReady(transactionMetadataStore);
    TxnID txnID = transactionMetadataStoreService.newTransaction(TransactionCoordinatorID.get(0), 5000).get();
    List<TransactionSubscription> partitions = new ArrayList<>();
    partitions.add(TransactionSubscription.builder().topic("ptn-1").subscription("sub-1").build());
    partitions.add(TransactionSubscription.builder().topic("ptn-2").subscription("sub-1").build());
    partitions.add(TransactionSubscription.builder().topic("ptn-3").subscription("sub-1").build());
    transactionMetadataStoreService.addAckedPartitionToTxn(txnID, partitions);
    TxnMeta txn = transactionMetadataStoreService.getTxnMeta(txnID).get();
    assertEquals(txn.status(), TxnStatus.OPEN);
    transactionMetadataStoreService.removeTransactionMetadataStore(TransactionCoordinatorID.get(0));
    Assert.assertEquals(transactionMetadataStoreService.getStores().size(), 0);
}
Also used : TxnID(org.apache.pulsar.client.api.transaction.TxnID) TransactionSubscription(org.apache.pulsar.transaction.coordinator.TransactionSubscription) ArrayList(java.util.ArrayList) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) TransactionMetadataStoreService(org.apache.pulsar.broker.TransactionMetadataStoreService) Test(org.testng.annotations.Test)

Example 4 with TxnMeta

use of org.apache.pulsar.transaction.coordinator.TxnMeta in project pulsar by apache.

the class InMemTransactionMetadataStore method getTxnMeta.

@Override
public CompletableFuture<TxnMeta> getTxnMeta(TxnID txnid) {
    CompletableFuture<TxnMeta> getFuture = new CompletableFuture<>();
    TxnMetaImpl txn = transactions.get(txnid);
    if (null == txn) {
        getFuture.completeExceptionally(new TransactionNotFoundException(txnid));
    } else {
        getFuture.complete(txn);
    }
    return getFuture;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) TransactionNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta)

Example 5 with TxnMeta

use of org.apache.pulsar.transaction.coordinator.TxnMeta in project pulsar by apache.

the class MLTransactionMetadataStore method newTransaction.

@Override
public CompletableFuture<TxnID> newTransaction(long timeOut) {
    CompletableFuture<TxnID> completableFuture = new CompletableFuture<>();
    internalPinnedExecutor.execute(() -> {
        if (!checkIfReady()) {
            completableFuture.completeExceptionally(new CoordinatorException.TransactionMetadataStoreStateException(tcID, State.Ready, getState(), "new Transaction"));
            return;
        }
        long mostSigBits = tcID.getId();
        long leastSigBits = sequenceIdGenerator.generateSequenceId();
        TxnID txnID = new TxnID(mostSigBits, leastSigBits);
        long currentTimeMillis = System.currentTimeMillis();
        TransactionMetadataEntry transactionMetadataEntry = new TransactionMetadataEntry().setTxnidMostBits(mostSigBits).setTxnidLeastBits(leastSigBits).setStartTime(currentTimeMillis).setTimeoutMs(timeOut).setMetadataOp(TransactionMetadataEntry.TransactionMetadataOp.NEW).setLastModificationTime(currentTimeMillis).setMaxLocalTxnId(sequenceIdGenerator.getCurrentSequenceId());
        transactionLog.append(transactionMetadataEntry).whenComplete((position, throwable) -> {
            if (throwable != null) {
                completableFuture.completeExceptionally(throwable);
            } else {
                appendLogCount.increment();
                TxnMeta txn = new TxnMetaImpl(txnID, currentTimeMillis, timeOut);
                List<Position> positions = new ArrayList<>();
                positions.add(position);
                Pair<TxnMeta, List<Position>> pair = MutablePair.of(txn, positions);
                txnMetaMap.put(leastSigBits, pair);
                this.timeoutTracker.addTransaction(leastSigBits, timeOut);
                createdTransactionCount.increment();
                completableFuture.complete(txnID);
            }
        });
    });
    return completableFuture;
}
Also used : TransactionMetadataEntry(org.apache.pulsar.transaction.coordinator.proto.TransactionMetadataEntry) Position(org.apache.bookkeeper.mledger.Position) ArrayList(java.util.ArrayList) TxnMeta(org.apache.pulsar.transaction.coordinator.TxnMeta) TxnID(org.apache.pulsar.client.api.transaction.TxnID) CompletableFuture(java.util.concurrent.CompletableFuture) CoordinatorException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

TxnMeta (org.apache.pulsar.transaction.coordinator.TxnMeta)42 ArrayList (java.util.ArrayList)31 List (java.util.List)27 MLTransactionMetadataStore (org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore)24 CompletableFuture (java.util.concurrent.CompletableFuture)21 TxnID (org.apache.pulsar.client.api.transaction.TxnID)21 Test (org.testng.annotations.Test)21 Position (org.apache.bookkeeper.mledger.Position)18 Field (java.lang.reflect.Field)15 ExecutionException (java.util.concurrent.ExecutionException)15 Pair (org.apache.commons.lang3.tuple.Pair)15 TransactionNotFoundException (org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.TransactionNotFoundException)15 ConcurrentSkipListMap (java.util.concurrent.ConcurrentSkipListMap)12 CoordinatorException (org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException)12 TimeoutException (java.util.concurrent.TimeoutException)9 CoordinatorNotFoundException (org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.CoordinatorNotFoundException)9 Map (java.util.Map)6 TimeUnit (java.util.concurrent.TimeUnit)6 TransactionMetadataStoreService (org.apache.pulsar.broker.TransactionMetadataStoreService)6 FutureUtil (org.apache.pulsar.common.util.FutureUtil)6