Class PendingAckHandleImpl

java.lang.Object
org.apache.pulsar.broker.transaction.pendingack.impl.PendingAckHandleState
org.apache.pulsar.broker.transaction.pendingack.impl.PendingAckHandleImpl
All Implemented Interfaces:
PendingAckHandle

public class PendingAckHandleImpl extends PendingAckHandleState implements PendingAckHandle
The default implementation of PendingAckHandle.
  • Field Details

    • recoverTime

      public final org.apache.pulsar.common.util.RecoverTimeRecord recoverTime
  • Constructor Details

  • Method Details

    • internalIndividualAcknowledgeMessage

      public void internalIndividualAcknowledgeMessage(org.apache.pulsar.client.api.transaction.TxnID txnID, List<org.apache.commons.lang3.tuple.MutablePair<org.apache.bookkeeper.mledger.impl.PositionImpl,Integer>> positions, CompletableFuture<Void> completableFuture)
    • individualAcknowledgeMessage

      public CompletableFuture<Void> individualAcknowledgeMessage(org.apache.pulsar.client.api.transaction.TxnID txnID, List<org.apache.commons.lang3.tuple.MutablePair<org.apache.bookkeeper.mledger.impl.PositionImpl,Integer>> positions)
      Description copied from interface: PendingAckHandle
      Acknowledge message(s) for an ongoing transaction.

      It can be of CommandAck.AckType.Individual. Single messages acked by ongoing transaction will be put in pending_ack state and only marked as deleted after transaction is committed.

      If transaction is aborted all messages acked by it will be put back to pending state.

      Client will not send batch size to server, we get the batch size from consumer pending ack. When we get the Batch size, we can accurate batch ack of this position.

      Specified by:
      individualAcknowledgeMessage in interface PendingAckHandle
      Parameters:
      txnID - TxnID TransactionID of an ongoing transaction trying to sck message.
      positions - MutablePair the pair of positions and these batch size.
      Returns:
      the future of this operation.
    • internalCumulativeAcknowledgeMessage

      public void internalCumulativeAcknowledgeMessage(org.apache.pulsar.client.api.transaction.TxnID txnID, List<org.apache.bookkeeper.mledger.impl.PositionImpl> positions, CompletableFuture<Void> completableFuture)
    • cumulativeAcknowledgeMessage

      public CompletableFuture<Void> cumulativeAcknowledgeMessage(org.apache.pulsar.client.api.transaction.TxnID txnID, List<org.apache.bookkeeper.mledger.impl.PositionImpl> positions)
      Description copied from interface: PendingAckHandle
      Acknowledge message(s) for an ongoing transaction.

      It can be of CommandAck.AckType.Cumulative. Single messages acked by ongoing transaction will be put in pending_ack state and only marked as deleted after transaction is committed.

      For a moment, we only allow one transaction cumulative ack multiple times when the position is greater than the old one.

      We have a transaction with cumulative ack, if other transaction want to cumulative ack, we will return TransactionConflictException.

      If an ongoing transaction cumulative acked a message and then try to ack single message which is greater than that one it cumulative acked, it'll succeed.

      Specified by:
      cumulativeAcknowledgeMessage in interface PendingAckHandle
      Parameters:
      txnID - TxnID TransactionID of an ongoing transaction trying to sck message.
      positions - MutablePair the pair of positions and these batch size.
      Returns:
      the future of this operation.
    • commitTxn

      public CompletableFuture<Void> commitTxn(org.apache.pulsar.client.api.transaction.TxnID txnID, Map<String,Long> properties, long lowWaterMark)
      Description copied from interface: PendingAckHandle
      Commit a transaction.
      Specified by:
      commitTxn in interface PendingAckHandle
      Parameters:
      txnID - TxnID to identify the transaction.
      properties - Additional user-defined properties that can be associated with a particular cursor position.
      lowWaterMark - the low water mark of this transaction
      Returns:
      the future of this operation.
    • internalAbortTxn

      public CompletableFuture<Void> internalAbortTxn(org.apache.pulsar.client.api.transaction.TxnID txnId, Consumer consumer, long lowWaterMark, CompletableFuture<Void> abortFuture)
    • abortTxn

      public CompletableFuture<Void> abortTxn(org.apache.pulsar.client.api.transaction.TxnID txnId, Consumer consumer, long lowWaterMark)
      Description copied from interface: PendingAckHandle
      Abort a transaction.
      Specified by:
      abortTxn in interface PendingAckHandle
      Parameters:
      txnId - TxnID to identify the transaction.
      consumer - Consumer which aborting transaction.
      lowWaterMark - the low water mark of this transaction
      Returns:
      the future of this operation.
    • syncBatchPositionAckSetForTransaction

      public void syncBatchPositionAckSetForTransaction(org.apache.bookkeeper.mledger.impl.PositionImpl position)
      Description copied from interface: PendingAckHandle
      Sync the position ack set, in order to clean up the cache of this position for pending ack handle.
      Specified by:
      syncBatchPositionAckSetForTransaction in interface PendingAckHandle
      Parameters:
      position - Position which position need to sync and carry it batch size
    • checkIsCanDeleteConsumerPendingAck

      public boolean checkIsCanDeleteConsumerPendingAck(org.apache.bookkeeper.mledger.impl.PositionImpl position)
      Description copied from interface: PendingAckHandle
      Judge the all ack set point have acked by normal ack and transaction pending ack.
      Specified by:
      checkIsCanDeleteConsumerPendingAck in interface PendingAckHandle
      Parameters:
      position - Position which position need to check
    • handleAbort

      protected void handleAbort(org.apache.pulsar.client.api.transaction.TxnID txnID, org.apache.pulsar.common.api.proto.CommandAck.AckType ackType)
    • handleCommit

      protected void handleCommit(org.apache.pulsar.client.api.transaction.TxnID txnID, org.apache.pulsar.common.api.proto.CommandAck.AckType ackType, Map<String,Long> properties)
    • handleCumulativeAckRecover

      protected void handleCumulativeAckRecover(org.apache.pulsar.client.api.transaction.TxnID txnID, org.apache.bookkeeper.mledger.impl.PositionImpl position)
    • handleIndividualAckRecover

      protected void handleIndividualAckRecover(org.apache.pulsar.client.api.transaction.TxnID txnID, List<org.apache.commons.lang3.tuple.MutablePair<org.apache.bookkeeper.mledger.impl.PositionImpl,Integer>> positions)
    • getTopicName

      public String getTopicName()
    • getSubName

      public String getSubName()
    • clearIndividualPosition

      public void clearIndividualPosition(org.apache.bookkeeper.mledger.Position position)
      Description copied from interface: PendingAckHandle
      When the position is actually deleted, we can use this method to clear the cache for individual ack messages.
      Specified by:
      clearIndividualPosition in interface PendingAckHandle
      Parameters:
      position - Position which position need to clear
    • pendingAckHandleFuture

      public CompletableFuture<PendingAckHandle> pendingAckHandleFuture()
      Description copied from interface: PendingAckHandle
      Pending ack recover whether ready future.
      Specified by:
      pendingAckHandleFuture in interface PendingAckHandle
      Returns:
      the future of result.
    • getStats

      public org.apache.pulsar.common.policies.data.TransactionPendingAckStats getStats(boolean lowWaterMarks)
      Description copied from interface: PendingAckHandle
      Get pending ack handle stats.
      Specified by:
      getStats in interface PendingAckHandle
      Returns:
      the stats of this pending ack handle.
    • completeHandleFuture

      public void completeHandleFuture()
    • exceptionHandleFuture

      public void exceptionHandleFuture(Throwable t)
    • getTransactionInPendingAckStats

      public org.apache.pulsar.common.policies.data.TransactionInPendingAckStats getTransactionInPendingAckStats(org.apache.pulsar.client.api.transaction.TxnID txnID)
      Description copied from interface: PendingAckHandle
      Get transaction in pending ack stats.
      Specified by:
      getTransactionInPendingAckStats in interface PendingAckHandle
      Parameters:
      txnID - the txnID
      Returns:
      the stats of this transaction in pending ack.
    • closeAsync

      public CompletableFuture<Void> closeAsync()
      Description copied from interface: PendingAckHandle
      Close the pending ack handle.
      Specified by:
      closeAsync in interface PendingAckHandle
      Returns:
      the future of this operation.
    • getStoreManageLedger

      public CompletableFuture<org.apache.bookkeeper.mledger.ManagedLedger> getStoreManageLedger()
    • checkPositionInPendingAckState

      public org.apache.pulsar.common.stats.PositionInPendingAckStats checkPositionInPendingAckState(org.apache.bookkeeper.mledger.impl.PositionImpl position, Integer batchIndex)
      Description copied from interface: PendingAckHandle
      Get the stats of this message position is in pending ack.
      Specified by:
      checkPositionInPendingAckState in interface PendingAckHandle
      Parameters:
      position - message position.
      batchIndex - the batch index of ths position.
      Returns:
      the stats of the message position.
    • checkIfPendingAckStoreInit

      public boolean checkIfPendingAckStoreInit()
      Description copied from interface: PendingAckHandle
      Check if the PendingAckStore is init.
      Specified by:
      checkIfPendingAckStoreInit in interface PendingAckHandle
      Returns:
      if the PendingAckStore is init.
    • getPositionInPendingAck

      public org.apache.bookkeeper.mledger.impl.PositionImpl getPositionInPendingAck(org.apache.bookkeeper.mledger.impl.PositionImpl position)
      Description copied from interface: PendingAckHandle
      If it returns null, it means this Position is not in pendingAck.

      If it does not return null, it means this Position is in pendingAck and if it is batch Position, it will return the corresponding ackSet in pendingAck

      Specified by:
      getPositionInPendingAck in interface PendingAckHandle
      Parameters:
      position - Position witch need to get in pendingAck
      Returns:
      Position return the position in pendingAck
    • handleCacheRequest

      protected void handleCacheRequest()