@@ -18,11 +18,12 @@ package kafka.coordinator.transaction
18
18
19
19
import java .nio .ByteBuffer
20
20
import java .util .Properties
21
+ import java .util .concurrent .{ConcurrentHashMap , ConcurrentMap }
21
22
import java .util .concurrent .atomic .AtomicBoolean
22
23
import java .util .concurrent .locks .ReentrantReadWriteLock
23
24
import kafka .server .ReplicaManager
24
25
import kafka .utils .CoreUtils .{inReadLock , inWriteLock }
25
- import kafka .utils .{ Logging , Pool }
26
+ import kafka .utils .Logging
26
27
import org .apache .kafka .common .config .TopicConfig
27
28
import org .apache .kafka .common .internals .Topic
28
29
import org .apache .kafka .common .message .ListTransactionsResponseData
@@ -126,7 +127,7 @@ class TransactionStateManager(brokerId: Int,
126
127
val now = time.milliseconds()
127
128
inReadLock(stateLock) {
128
129
transactionMetadataCache.flatMap { case (_, entry) =>
129
- entry.metadataPerTransactionalId.filter { case (_, txnMetadata) =>
130
+ entry.metadataPerTransactionalId.asScala. filter { case (_, txnMetadata) =>
130
131
if (txnMetadata.pendingTransitionInProgress) {
131
132
false
132
133
} else {
@@ -156,7 +157,7 @@ class TransactionStateManager(brokerId: Int,
156
157
val maxBatchSize = logConfig.maxMessageSize
157
158
val expired = mutable.ListBuffer .empty[TransactionalIdCoordinatorEpochAndMetadata ]
158
159
var recordsBuilder : MemoryRecordsBuilder = null
159
- val stateEntries = txnMetadataCacheEntry.metadataPerTransactionalId.values.iterator.buffered
160
+ val stateEntries = txnMetadataCacheEntry.metadataPerTransactionalId.values.asScala. iterator.buffered
160
161
161
162
def flushRecordsBuilder (): Unit = {
162
163
writeTombstonesForExpiredTransactionalIds(
@@ -350,7 +351,7 @@ class TransactionStateManager(brokerId: Int,
350
351
351
352
val states = new java.util.ArrayList [ListTransactionsResponseData .TransactionState ]
352
353
transactionMetadataCache.foreachEntry { (_, cache) =>
353
- cache.metadataPerTransactionalId.values.foreach { txnMetadata =>
354
+ cache.metadataPerTransactionalId.forEach { (_, txnMetadata) =>
354
355
txnMetadata.inLock {
355
356
if (shouldInclude(txnMetadata)) {
356
357
states.add(new ListTransactionsResponseData .TransactionState ()
@@ -386,7 +387,7 @@ class TransactionStateManager(brokerId: Int,
386
387
case Some (cacheEntry) =>
387
388
val txnMetadata = Option (cacheEntry.metadataPerTransactionalId.get(transactionalId)).orElse {
388
389
createdTxnMetadataOpt.map { createdTxnMetadata =>
389
- Option (cacheEntry.metadataPerTransactionalId.putIfNotExists (transactionalId, createdTxnMetadata))
390
+ Option (cacheEntry.metadataPerTransactionalId.putIfAbsent (transactionalId, createdTxnMetadata))
390
391
.getOrElse(createdTxnMetadata)
391
392
}
392
393
}
@@ -428,10 +429,10 @@ class TransactionStateManager(brokerId: Int,
428
429
429
430
def partitionFor (transactionalId : String ): Int = Utils .abs(transactionalId.hashCode) % transactionTopicPartitionCount
430
431
431
- private def loadTransactionMetadata (topicPartition : TopicPartition , coordinatorEpoch : Int ): Pool [String , TransactionMetadata ] = {
432
+ private def loadTransactionMetadata (topicPartition : TopicPartition , coordinatorEpoch : Int ): ConcurrentMap [String , TransactionMetadata ] = {
432
433
def logEndOffset = replicaManager.getLogEndOffset(topicPartition).getOrElse(- 1L )
433
434
434
- val loadedTransactions = new Pool [String , TransactionMetadata ]
435
+ val loadedTransactions = new ConcurrentHashMap [String , TransactionMetadata ]
435
436
436
437
replicaManager.getLog(topicPartition) match {
437
438
case None =>
@@ -509,7 +510,7 @@ class TransactionStateManager(brokerId: Int,
509
510
*/
510
511
private [transaction] def addLoadedTransactionsToCache (txnTopicPartition : Int ,
511
512
coordinatorEpoch : Int ,
512
- loadedTransactions : Pool [String , TransactionMetadata ]): Unit = {
513
+ loadedTransactions : ConcurrentMap [String , TransactionMetadata ]): Unit = {
513
514
val txnMetadataCacheEntry = TxnMetadataCacheEntry (coordinatorEpoch, loadedTransactions)
514
515
val previousTxnMetadataCacheEntryOpt = transactionMetadataCache.put(txnTopicPartition, txnMetadataCacheEntry)
515
516
@@ -549,22 +550,21 @@ class TransactionStateManager(brokerId: Int,
549
550
addLoadedTransactionsToCache(topicPartition.partition, coordinatorEpoch, loadedTransactions)
550
551
551
552
val transactionsPendingForCompletion = new mutable.ListBuffer [TransactionalIdCoordinatorEpochAndTransitMetadata ]
552
- loadedTransactions.foreach {
553
- case (transactionalId, txnMetadata) =>
554
- txnMetadata.inLock {
555
- // if state is PrepareCommit or PrepareAbort we need to complete the transaction
556
- txnMetadata.state match {
557
- case PrepareAbort =>
558
- transactionsPendingForCompletion +=
559
- TransactionalIdCoordinatorEpochAndTransitMetadata (transactionalId, coordinatorEpoch, TransactionResult .ABORT , txnMetadata, txnMetadata.prepareComplete(time.milliseconds()))
560
- case PrepareCommit =>
561
- transactionsPendingForCompletion +=
562
- TransactionalIdCoordinatorEpochAndTransitMetadata (transactionalId, coordinatorEpoch, TransactionResult .COMMIT , txnMetadata, txnMetadata.prepareComplete(time.milliseconds()))
563
- case _ =>
564
- // nothing needs to be done
565
- }
553
+ loadedTransactions.forEach((transactionalId, txnMetadata) => {
554
+ txnMetadata.inLock {
555
+ // if state is PrepareCommit or PrepareAbort we need to complete the transaction
556
+ txnMetadata.state match {
557
+ case PrepareAbort =>
558
+ transactionsPendingForCompletion +=
559
+ TransactionalIdCoordinatorEpochAndTransitMetadata (transactionalId, coordinatorEpoch, TransactionResult .ABORT , txnMetadata, txnMetadata.prepareComplete(time.milliseconds()))
560
+ case PrepareCommit =>
561
+ transactionsPendingForCompletion +=
562
+ TransactionalIdCoordinatorEpochAndTransitMetadata (transactionalId, coordinatorEpoch, TransactionResult .COMMIT , txnMetadata, txnMetadata.prepareComplete(time.milliseconds()))
563
+ case _ =>
564
+ // nothing needs to be done
566
565
}
567
- }
566
+ }
567
+ })
568
568
569
569
// we first remove the partition from loading partition then send out the markers for those pending to be
570
570
// completed transactions, so that when the markers get sent the attempt of appending the complete transaction
@@ -820,7 +820,7 @@ class TransactionStateManager(brokerId: Int,
820
820
821
821
822
822
private [transaction] case class TxnMetadataCacheEntry (coordinatorEpoch : Int ,
823
- metadataPerTransactionalId : Pool [String , TransactionMetadata ]) {
823
+ metadataPerTransactionalId : ConcurrentMap [String , TransactionMetadata ]) {
824
824
override def toString : String = {
825
825
s " TxnMetadataCacheEntry(coordinatorEpoch= $coordinatorEpoch, numTransactionalEntries= ${metadataPerTransactionalId.size}) "
826
826
}
0 commit comments