Search in sources :

Example 1 with TransactionCoordinatorID

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

the class TransactionMetadataStoreService method getLowWaterMark.

public long getLowWaterMark(TxnID txnID) {
    TransactionCoordinatorID tcId = getTcIdFromTxnId(txnID);
    TransactionMetadataStore store = stores.get(tcId);
    if (store == null) {
        return 0;
    }
    return store.getLowWaterMark();
}
Also used : TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) TransactionMetadataStore(org.apache.pulsar.transaction.coordinator.TransactionMetadataStore)

Example 2 with TransactionCoordinatorID

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

the class TransactionMetadataStoreService method getTxnMeta.

public CompletableFuture<TxnMeta> getTxnMeta(TxnID txnId) {
    TransactionCoordinatorID tcId = getTcIdFromTxnId(txnId);
    TransactionMetadataStore store = stores.get(tcId);
    if (store == null) {
        return FutureUtil.failedFuture(new CoordinatorNotFoundException(tcId));
    }
    return store.getTxnMeta(txnId);
}
Also used : TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) TransactionMetadataStore(org.apache.pulsar.transaction.coordinator.TransactionMetadataStore) CoordinatorNotFoundException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException.CoordinatorNotFoundException)

Example 3 with TransactionCoordinatorID

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

the class ServerCnx method handleAddSubscriptionToTxn.

@Override
protected void handleAddSubscriptionToTxn(CommandAddSubscriptionToTxn command) {
    final TxnID txnID = new TxnID(command.getTxnidMostBits(), command.getTxnidLeastBits());
    final long requestId = command.getRequestId();
    if (log.isDebugEnabled()) {
        log.debug("Receive add published partition to txn request {} from {} with txnId {}", requestId, remoteAddress, txnID);
    }
    final TransactionCoordinatorID tcId = TransactionCoordinatorID.get(command.getTxnidMostBits());
    if (!checkTransactionEnableAndSendError(requestId)) {
        return;
    }
    TransactionMetadataStoreService transactionMetadataStoreService = service.pulsar().getTransactionMetadataStoreService();
    transactionMetadataStoreService.addAckedPartitionToTxn(txnID, MLTransactionMetadataStore.subscriptionToTxnSubscription(command.getSubscriptionsList())).whenComplete(((v, ex) -> {
        if (ex == null) {
            if (log.isDebugEnabled()) {
                log.debug("Send response success for add published partition to txn request {}", requestId);
            }
            ctx.writeAndFlush(Commands.newAddSubscriptionToTxnResponse(requestId, txnID.getLeastSigBits(), txnID.getMostSigBits()));
        } else {
            ex = handleTxnException(ex, BaseCommand.Type.ADD_SUBSCRIPTION_TO_TXN.name(), requestId);
            ctx.writeAndFlush(Commands.newAddSubscriptionToTxnResponse(requestId, txnID.getMostSigBits(), BrokerServiceException.getClientErrorCode(ex), ex.getMessage()));
            transactionMetadataStoreService.handleOpFail(ex, tcId);
        }
    }));
}
Also used : CommandAuthResponse(org.apache.pulsar.common.api.proto.CommandAuthResponse) CommandUnsubscribe(org.apache.pulsar.common.api.proto.CommandUnsubscribe) ServiceUnitNotReadyException(org.apache.pulsar.broker.service.BrokerServiceException.ServiceUnitNotReadyException) CommandProducer(org.apache.pulsar.common.api.proto.CommandProducer) MessageIdData(org.apache.pulsar.common.api.proto.MessageIdData) ByteBufPair(org.apache.pulsar.common.protocol.ByteBufPair) StringUtils(org.apache.commons.lang3.StringUtils) ProtocolVersion(org.apache.pulsar.common.api.proto.ProtocolVersion) TxnID(org.apache.pulsar.client.api.transaction.TxnID) MLTransactionMetadataStore(org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore) TopicOperation(org.apache.pulsar.common.policies.data.TopicOperation) MutableLong(org.apache.commons.lang3.mutable.MutableLong) Map(java.util.Map) BrokerInterceptor(org.apache.pulsar.broker.intercept.BrokerInterceptor) RestException(org.apache.pulsar.broker.web.RestException) NamespaceOperation(org.apache.pulsar.common.policies.data.NamespaceOperation) BaseCommand(org.apache.pulsar.common.api.proto.BaseCommand) CommandAck(org.apache.pulsar.common.api.proto.CommandAck) PositionImpl(org.apache.bookkeeper.mledger.impl.PositionImpl) InterceptException(org.apache.pulsar.common.intercept.InterceptException) CommandFlow(org.apache.pulsar.common.api.proto.CommandFlow) CommandConsumerStats(org.apache.pulsar.common.api.proto.CommandConsumerStats) ServerError(org.apache.pulsar.common.api.proto.ServerError) Set(java.util.Set) CommandNewTxn(org.apache.pulsar.common.api.proto.CommandNewTxn) StringUtils.isNotBlank(org.apache.commons.lang3.StringUtils.isNotBlank) BatchMessageIdImpl(org.apache.pulsar.client.impl.BatchMessageIdImpl) MessageMetadata(org.apache.pulsar.common.api.proto.MessageMetadata) SafeRun(org.apache.bookkeeper.mledger.util.SafeRun) SslHandler(io.netty.handler.ssl.SslHandler) AsyncCallbacks(org.apache.bookkeeper.mledger.AsyncCallbacks) ExceptionUtils(org.apache.commons.lang3.exception.ExceptionUtils) ClientCnx(org.apache.pulsar.client.impl.ClientCnx) ChannelOption(io.netty.channel.ChannelOption) SchemaRegistryService(org.apache.pulsar.broker.service.schema.SchemaRegistryService) AuthenticationState(org.apache.pulsar.broker.authentication.AuthenticationState) CommandGetTopicsOfNamespace(org.apache.pulsar.common.api.proto.CommandGetTopicsOfNamespace) TopicNotFoundException(org.apache.pulsar.broker.service.BrokerServiceException.TopicNotFoundException) SchemaType(org.apache.pulsar.common.schema.SchemaType) Commands(org.apache.pulsar.common.protocol.Commands) CommandCloseProducer(org.apache.pulsar.common.api.proto.CommandCloseProducer) Strings(com.google.common.base.Strings) SubType(org.apache.pulsar.common.api.proto.CommandSubscribe.SubType) ServerMetadataException(org.apache.pulsar.broker.service.BrokerServiceException.ServerMetadataException) SSLSession(javax.net.ssl.SSLSession) CommandGetOrCreateSchema(org.apache.pulsar.common.api.proto.CommandGetOrCreateSchema) ProtocolVersion.v5(org.apache.pulsar.common.api.proto.ProtocolVersion.v5) CommandGetSchema(org.apache.pulsar.common.api.proto.CommandGetSchema) SchemaInfoUtil(org.apache.pulsar.client.impl.schema.SchemaInfoUtil) CommandRedeliverUnacknowledgedMessages(org.apache.pulsar.common.api.proto.CommandRedeliverUnacknowledgedMessages) Metadata(org.apache.pulsar.common.naming.Metadata) Promise(io.netty.util.concurrent.Promise) AuthenticationProvider(org.apache.pulsar.broker.authentication.AuthenticationProvider) InitialPosition(org.apache.pulsar.common.api.proto.CommandSubscribe.InitialPosition) lombok.val(lombok.val) PulsarService(org.apache.pulsar.broker.PulsarService) KeySharedMode(org.apache.pulsar.common.api.proto.KeySharedMode) CommandEndTxnOnSubscription(org.apache.pulsar.common.api.proto.CommandEndTxnOnSubscription) CommandConnect(org.apache.pulsar.common.api.proto.CommandConnect) SchemaData(org.apache.pulsar.common.protocol.schema.SchemaData) ProducerAccessMode(org.apache.pulsar.common.api.proto.ProducerAccessMode) CommandLookupTopic(org.apache.pulsar.common.api.proto.CommandLookupTopic) MutableInt(org.apache.commons.lang3.mutable.MutableInt) SocketAddress(java.net.SocketAddress) CommandAddPartitionToTxn(org.apache.pulsar.common.api.proto.CommandAddPartitionToTxn) LoggerFactory(org.slf4j.LoggerFactory) AuthData(org.apache.pulsar.common.api.AuthData) Exceptions(org.apache.pulsar.functions.utils.Exceptions) AuthenticationException(javax.naming.AuthenticationException) KeyValue(org.apache.pulsar.common.api.proto.KeyValue) PersistentTopicsBase.unsafeGetPartitionedTopicMetadataAsync(org.apache.pulsar.broker.admin.impl.PersistentTopicsBase.unsafeGetPartitionedTopicMetadataAsync) CommandEndTxnOnPartition(org.apache.pulsar.common.api.proto.CommandEndTxnOnPartition) Preconditions.checkArgument(com.google.common.base.Preconditions.checkArgument) BacklogQuotaType(org.apache.pulsar.common.policies.data.BacklogQuota.BacklogQuotaType) Gauge(io.prometheus.client.Gauge) TxnAction(org.apache.pulsar.common.api.proto.TxnAction) NamespaceName(org.apache.pulsar.common.naming.NamespaceName) Schema(org.apache.pulsar.common.api.proto.Schema) TransactionMetadataStoreService(org.apache.pulsar.broker.TransactionMetadataStoreService) PulsarClientException(org.apache.pulsar.client.api.PulsarClientException) IdentityHashMap(java.util.IdentityHashMap) SubscriptionNotFoundException(org.apache.pulsar.broker.service.BrokerServiceException.SubscriptionNotFoundException) Position(org.apache.bookkeeper.mledger.Position) InetSocketAddress(java.net.InetSocketAddress) Collectors(java.util.stream.Collectors) CommandEndTxn(org.apache.pulsar.common.api.proto.CommandEndTxn) AuthenticationDataSource(org.apache.pulsar.broker.authentication.AuthenticationDataSource) Objects(java.util.Objects) ManagedLedgerException(org.apache.bookkeeper.mledger.ManagedLedgerException) MessageIdImpl(org.apache.pulsar.client.impl.MessageIdImpl) PersistentTopic(org.apache.pulsar.broker.service.persistent.PersistentTopic) FutureUtil(org.apache.pulsar.common.util.FutureUtil) PersistentSubscription(org.apache.pulsar.broker.service.persistent.PersistentSubscription) Optional(java.util.Optional) IncompatibleSchemaException(org.apache.pulsar.broker.service.schema.exceptions.IncompatibleSchemaException) PulsarHandler(org.apache.pulsar.common.protocol.PulsarHandler) CommandTcClientConnectRequest(org.apache.pulsar.common.api.proto.CommandTcClientConnectRequest) TopicName(org.apache.pulsar.common.naming.TopicName) CommandAddSubscriptionToTxn(org.apache.pulsar.common.api.proto.CommandAddSubscriptionToTxn) Entry(org.apache.bookkeeper.mledger.Entry) CommandSend(org.apache.pulsar.common.api.proto.CommandSend) BacklogQuota(org.apache.pulsar.common.policies.data.BacklogQuota) CompletableFuture(java.util.concurrent.CompletableFuture) TopicLookupBase.lookupTopicAsync(org.apache.pulsar.broker.lookup.TopicLookupBase.lookupTopicAsync) KeySharedMeta(org.apache.pulsar.common.api.proto.KeySharedMeta) CommandSubscribe(org.apache.pulsar.common.api.proto.CommandSubscribe) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) ByteBuf(io.netty.buffer.ByteBuf) CoordinatorException(org.apache.pulsar.transaction.coordinator.exceptions.CoordinatorException) FastThreadLocal(io.netty.util.concurrent.FastThreadLocal) CommandPartitionedTopicMetadata(org.apache.pulsar.common.api.proto.CommandPartitionedTopicMetadata) CommandSeek(org.apache.pulsar.common.api.proto.CommandSeek) ConsumerStatsImpl(org.apache.pulsar.common.policies.data.stats.ConsumerStatsImpl) NoSuchElementException(java.util.NoSuchElementException) CommandGetLastMessageId(org.apache.pulsar.common.api.proto.CommandGetLastMessageId) CommandUtils(org.apache.pulsar.common.protocol.CommandUtils) ManagedLedgerImpl(org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl) AuthenticationDataCommand(org.apache.pulsar.broker.authentication.AuthenticationDataCommand) DEFAULT_CONSUMER_EPOCH(org.apache.pulsar.common.protocol.Commands.DEFAULT_CONSUMER_EPOCH) Logger(org.slf4j.Logger) Semaphore(java.util.concurrent.Semaphore) ServiceConfiguration(org.apache.pulsar.broker.ServiceConfiguration) FeatureFlags(org.apache.pulsar.common.api.proto.FeatureFlags) CommandCloseConsumer(org.apache.pulsar.common.api.proto.CommandCloseConsumer) SchemaVersion(org.apache.pulsar.common.protocol.schema.SchemaVersion) Commands.newLookupErrorResponse(org.apache.pulsar.common.protocol.Commands.newLookupErrorResponse) TimeUnit(java.util.concurrent.TimeUnit) HAProxyMessage(io.netty.handler.codec.haproxy.HAProxyMessage) ConcurrentLongHashMap(org.apache.pulsar.common.util.collections.ConcurrentLongHashMap) ConsumerBusyException(org.apache.pulsar.broker.service.BrokerServiceException.ConsumerBusyException) ChannelHandler(io.netty.channel.ChannelHandler) VisibleForTesting(com.google.common.annotations.VisibleForTesting) TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) Collections(java.util.Collections) TxnID(org.apache.pulsar.client.api.transaction.TxnID) TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) TransactionMetadataStoreService(org.apache.pulsar.broker.TransactionMetadataStoreService)

Example 4 with TransactionCoordinatorID

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

the class TransactionMetricsTest method testDuplicateMetricTypeDefinitions.

@Test
public void testDuplicateMetricTypeDefinitions() throws Exception {
    admin.lookups().lookupTopic(TopicName.TRANSACTION_COORDINATOR_ASSIGN.toString());
    TransactionCoordinatorID transactionCoordinatorIDOne = TransactionCoordinatorID.get(0);
    TransactionCoordinatorID transactionCoordinatorIDTwo = TransactionCoordinatorID.get(1);
    pulsar.getTransactionMetadataStoreService().handleTcClientConnect(transactionCoordinatorIDOne);
    pulsar.getTransactionMetadataStoreService().handleTcClientConnect(transactionCoordinatorIDTwo);
    Awaitility.await().until(() -> pulsar.getTransactionMetadataStoreService().getStores().size() == 2);
    pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl.toString()).enableTransaction(true).build();
    Producer<byte[]> p1 = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1").sendTimeout(0, TimeUnit.SECONDS).create();
    Transaction transaction = pulsarClient.newTransaction().withTransactionTimeout(5, TimeUnit.SECONDS).build().get();
    for (int i = 0; i < 10; i++) {
        String message = "my-message-" + i;
        p1.newMessage(transaction).value(message.getBytes()).send();
    }
    ByteArrayOutputStream statsOut = new ByteArrayOutputStream();
    PrometheusMetricsGenerator.generate(pulsar, false, false, false, statsOut);
    String metricsStr = statsOut.toString();
    Map<String, String> typeDefs = new HashMap<>();
    Map<String, String> metricNames = new HashMap<>();
    Pattern typePattern = Pattern.compile("^#\\s+TYPE\\s+(\\w+)\\s+(\\w+)");
    Splitter.on("\n").split(metricsStr).forEach(line -> {
        if (line.isEmpty()) {
            return;
        }
        if (line.startsWith("#")) {
            // Check for duplicate type definitions
            Matcher typeMatcher = typePattern.matcher(line);
            checkArgument(typeMatcher.matches());
            String metricName = typeMatcher.group(1);
            String type = typeMatcher.group(2);
            // "Only one TYPE line may exist for a given metric name."
            if (!typeDefs.containsKey(metricName)) {
                typeDefs.put(metricName, type);
            } else {
                log.warn(metricsStr);
                fail("Duplicate type definition found for TYPE definition " + metricName);
            }
            // "The TYPE line for a metric name must appear before the first sample is reported for that metric name."
            if (metricNames.containsKey(metricName)) {
                log.info(metricsStr);
                fail("TYPE definition for " + metricName + " appears after first sample");
            }
        }
    });
}
Also used : Pattern(java.util.regex.Pattern) Transaction(org.apache.pulsar.client.api.transaction.Transaction) HashMap(java.util.HashMap) Matcher(java.util.regex.Matcher) TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Test(org.testng.annotations.Test)

Example 5 with TransactionCoordinatorID

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

the class TransactionMetricsTest method testManagedLedgerMetricsWhenPendingAckNotInit.

@Test
public void testManagedLedgerMetricsWhenPendingAckNotInit() throws Exception {
    String ns1 = "prop/ns-abc1";
    admin.namespaces().createNamespace(ns1);
    String topic = "persistent://" + ns1 + "/testManagedLedgerMetricsWhenPendingAckNotInit";
    String subName = "test_managed_ledger_metrics";
    String subName2 = "test_pending_ack_no_init";
    admin.topics().createNonPartitionedTopic(topic);
    admin.lookups().lookupTopic(TopicName.TRANSACTION_COORDINATOR_ASSIGN.toString());
    TransactionCoordinatorID transactionCoordinatorIDOne = TransactionCoordinatorID.get(0);
    pulsar.getTransactionMetadataStoreService().handleTcClientConnect(transactionCoordinatorIDOne).get();
    admin.topics().createSubscription(topic, subName, MessageId.earliest);
    admin.topics().createSubscription(topic, subName2, MessageId.earliest);
    Awaitility.await().atMost(2000, TimeUnit.MILLISECONDS).until(() -> pulsar.getTransactionMetadataStoreService().getStores().size() == 1);
    pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl.toString()).enableTransaction(true).build();
    Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topic).receiverQueueSize(10).subscriptionName(subName).subscriptionType(SubscriptionType.Key_Shared).subscribe();
    Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
    Transaction transaction = pulsarClient.newTransaction().withTransactionTimeout(10, TimeUnit.SECONDS).build().get();
    producer.send("hello pulsar".getBytes());
    consumer.acknowledgeAsync(consumer.receive().getMessageId(), transaction).get();
    ByteArrayOutputStream statsOut = new ByteArrayOutputStream();
    PrometheusMetricsGenerator.generate(pulsar, true, false, false, statsOut);
    String metricsStr = statsOut.toString();
    Multimap<String, PrometheusMetricsTest.Metric> metrics = parseMetrics(metricsStr);
    Collection<PrometheusMetricsTest.Metric> metric = metrics.get("pulsar_storage_size");
    checkManagedLedgerMetrics(subName, 32, metric);
    // No statistics of the pendingAck are generated when the pendingAck is not initialized.
    for (PrometheusMetricsTest.Metric metric1 : metric) {
        if (metric1.tags.containsValue(subName2)) {
            Assert.fail();
        }
    }
    consumer = pulsarClient.newConsumer().topic(topic).receiverQueueSize(10).subscriptionName(subName2).subscriptionType(SubscriptionType.Key_Shared).subscribe();
    transaction = pulsarClient.newTransaction().withTransactionTimeout(10, TimeUnit.SECONDS).build().get();
    consumer.acknowledgeAsync(consumer.receive().getMessageId(), transaction).get();
    statsOut = new ByteArrayOutputStream();
    PrometheusMetricsGenerator.generate(pulsar, true, false, false, statsOut);
    metricsStr = statsOut.toString();
    metrics = parseMetrics(metricsStr);
    metric = metrics.get("pulsar_storage_size");
    checkManagedLedgerMetrics(subName2, 32, metric);
}
Also used : Transaction(org.apache.pulsar.client.api.transaction.Transaction) TransactionCoordinatorID(org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Test(org.testng.annotations.Test)

Aggregations

TransactionCoordinatorID (org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID)19 TransactionMetadataStore (org.apache.pulsar.transaction.coordinator.TransactionMetadataStore)6 ByteArrayOutputStream (java.io.ByteArrayOutputStream)5 Map (java.util.Map)5 Optional (java.util.Optional)5 CompletableFuture (java.util.concurrent.CompletableFuture)5 TimeUnit (java.util.concurrent.TimeUnit)5 AsyncCallbacks (org.apache.bookkeeper.mledger.AsyncCallbacks)5 ManagedLedgerException (org.apache.bookkeeper.mledger.ManagedLedgerException)5 Position (org.apache.bookkeeper.mledger.Position)5 ManagedLedgerImpl (org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl)5 PositionImpl (org.apache.bookkeeper.mledger.impl.PositionImpl)5 TransactionMetadataStoreService (org.apache.pulsar.broker.TransactionMetadataStoreService)5 TxnID (org.apache.pulsar.client.api.transaction.TxnID)5 MLTransactionMetadataStore (org.apache.pulsar.transaction.coordinator.impl.MLTransactionMetadataStore)5 Test (org.testng.annotations.Test)5 VisibleForTesting (com.google.common.annotations.VisibleForTesting)4 Preconditions.checkArgument (com.google.common.base.Preconditions.checkArgument)4 Strings (com.google.common.base.Strings)4 ByteBuf (io.netty.buffer.ByteBuf)4