3232import java .util .concurrent .Executors ;
3333import java .util .concurrent .atomic .AtomicReferenceFieldUpdater ;
3434import java .util .concurrent .atomic .LongAdder ;
35+ import lombok .Getter ;
3536import org .apache .bookkeeper .mledger .ManagedLedger ;
3637import org .apache .bookkeeper .mledger .Position ;
3738import org .apache .commons .lang3 .StringUtils ;
@@ -72,6 +73,7 @@ public class MLTransactionMetadataStore
7273 private final TransactionCoordinatorID tcID ;
7374 private final MLTransactionLogImpl transactionLog ;
7475 @ VisibleForTesting
76+ @ Getter
7577 final ConcurrentSkipListMap <Long , Pair <TxnMeta , List <Position >>> txnMetaMap = new ConcurrentSkipListMap <>();
7678 private final TransactionTimeoutTracker timeoutTracker ;
7779 private final TransactionMetadataStoreStats transactionMetadataStoreStats ;
@@ -80,6 +82,9 @@ public class MLTransactionMetadataStore
8082 private final LongAdder abortedTransactionCount ;
8183 private final LongAdder transactionTimeoutCount ;
8284 private final LongAdder appendLogCount ;
85+ @ Getter
86+ @ VisibleForTesting
87+ private final LongAdder onGoingTxnCount ;
8388 private final MLTransactionSequenceIdGenerator sequenceIdGenerator ;
8489 private final ExecutorService internalPinnedExecutor ;
8590 public final RecoverTimeRecord recoverTime = new RecoverTimeRecord ();
@@ -108,6 +113,7 @@ public MLTransactionMetadataStore(TransactionCoordinatorID tcID,
108113 this .abortedTransactionCount = new LongAdder ();
109114 this .transactionTimeoutCount = new LongAdder ();
110115 this .appendLogCount = new LongAdder ();
116+ this .onGoingTxnCount = new LongAdder ();
111117 DefaultThreadFactory threadFactory = new DefaultThreadFactory ("transaction_coordinator_"
112118 + tcID .toString () + "thread_factory" );
113119 this .internalPinnedExecutor = Executors .newSingleThreadScheduledExecutor (threadFactory );
@@ -162,6 +168,7 @@ public void handleMetadataEntry(Position position, TransactionMetadataEntry tran
162168 final TxnMetaImpl left = new TxnMetaImpl (txnID ,
163169 openTimestamp , timeoutAt , owner );
164170 txnMetaMap .put (transactionId , MutablePair .of (left , positions ));
171+ onGoingTxnCount .increment ();
165172 recoverTracker .handleOpenStatusTransaction (txnSequenceId ,
166173 timeoutAt + openTimestamp );
167174 }
@@ -197,8 +204,12 @@ public void handleMetadataEntry(Position position, TransactionMetadataEntry tran
197204 recoverTracker .updateTransactionStatus (txnID .getLeastSigBits (), newStatus );
198205 if (newStatus == TxnStatus .COMMITTED || newStatus == TxnStatus .ABORTED ) {
199206 transactionLog .deletePosition (txnMetaMap
200- .get (transactionId ).getRight ()).thenAccept (v ->
201- txnMetaMap .remove (transactionId ).getLeft ());
207+ .get (transactionId ).getRight ()).thenAccept (v -> {
208+ if (txnMetaMap .remove (transactionId ) != null ) {
209+ onGoingTxnCount .decrement ();
210+ }
211+ }
212+ );
202213 }
203214 }
204215 break ;
@@ -237,7 +248,7 @@ public CompletableFuture<TxnMeta> getTxnMeta(TxnID txnID) {
237248 @ Override
238249 public CompletableFuture <TxnID > newTransaction (long timeOut , String owner ) {
239250 if (this .maxActiveTransactionsPerCoordinator == 0
240- || this .maxActiveTransactionsPerCoordinator > txnMetaMap . size ()) {
251+ || this .maxActiveTransactionsPerCoordinator > onGoingTxnCount . longValue ()) {
241252 CompletableFuture <TxnID > completableFuture = new CompletableFuture <>();
242253 FutureUtil .safeRunAsync (() -> {
243254 if (!checkIfReady ()) {
@@ -276,6 +287,7 @@ public CompletableFuture<TxnID> newTransaction(long timeOut, String owner) {
276287 positions .add (position );
277288 Pair <TxnMeta , List <Position >> pair = MutablePair .of (txn , positions );
278289 txnMetaMap .put (leastSigBits , pair );
290+ onGoingTxnCount .increment ();
279291 this .timeoutTracker .addTransaction (leastSigBits , timeOut );
280292 createdTransactionCount .increment ();
281293 completableFuture .complete (txnID );
@@ -422,7 +434,9 @@ public CompletableFuture<Void> updateTxnStatus(TxnID txnID, TxnStatus newStatus,
422434 } else {
423435 abortedTransactionCount .increment ();
424436 }
425- txnMetaMap .remove (txnID .getLeastSigBits ());
437+ if (txnMetaMap .remove (txnID .getLeastSigBits ()) != null ) {
438+ onGoingTxnCount .decrement ();
439+ }
426440 transactionLog .deletePosition (txnMetaListPair .getRight ()).exceptionally (ex -> {
427441 log .warn ("Failed to delete transaction log position "
428442 + "at end transaction [{}]" , txnID );
@@ -466,7 +480,7 @@ public TransactionCoordinatorStats getCoordinatorStats() {
466480 transactionCoordinatorstats .setLowWaterMark (getLowWaterMark ());
467481 transactionCoordinatorstats .setState (getState ().name ());
468482 transactionCoordinatorstats .setLeastSigBits (sequenceIdGenerator .getCurrentSequenceId ());
469- transactionCoordinatorstats .ongoingTxnSize = txnMetaMap . size ();
483+ transactionCoordinatorstats .ongoingTxnSize = onGoingTxnCount . longValue ();
470484 transactionCoordinatorstats .recoverStartTime = recoverTime .getRecoverStartTime ();
471485 transactionCoordinatorstats .recoverEndTime = recoverTime .getRecoverEndTime ();
472486 return transactionCoordinatorstats ;
@@ -490,6 +504,7 @@ public CompletableFuture<Void> closeAsync() {
490504 internalPinnedExecutor .shutdown ();
491505 return transactionLog .closeAsync ().thenCompose (v -> {
492506 txnMetaMap .clear ();
507+ onGoingTxnCount .reset ();
493508 this .timeoutTracker .close ();
494509 if (!this .changeToCloseState ()) {
495510 return FutureUtil .failedFuture (
@@ -508,7 +523,7 @@ public CompletableFuture<Void> closeAsync() {
508523 @ Override
509524 public TransactionMetadataStoreStats getMetadataStoreStats () {
510525 this .transactionMetadataStoreStats .setCoordinatorId (tcID .getId ());
511- this .transactionMetadataStoreStats .setActives (txnMetaMap . size ());
526+ this .transactionMetadataStoreStats .setActives (onGoingTxnCount . intValue ());
512527 this .transactionMetadataStoreStats .setCreatedCount (this .createdTransactionCount .longValue ());
513528 this .transactionMetadataStoreStats .setCommittedCount (this .committedTransactionCount .longValue ());
514529 this .transactionMetadataStoreStats .setAbortedCount (this .abortedTransactionCount .longValue ());
0 commit comments