[ 
https://issues.apache.org/jira/browse/KAFKA-9350?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17675543#comment-17675543
 ] 

zhangzhisheng commented on KAFKA-9350:
--------------------------------------

 

kafka version: 2.13_2.7.2

I've found the same error in a 2.7.2 broker

 
{code:java}

// code placeholder
[2023-01-11 20:06:09,167] ERROR Uncaught exception in scheduled task 
'handleTxnCompletion-1701009' (kafka.utils.KafkaScheduler)
java.lang.IllegalStateException: Trying to complete a transactional offset 
commit for producerId 1701009 and groupId prd-feature-result even though the 
offset commit record itself hasn't been appended to the log.
        at 
kafka.coordinator.group.GroupMetadata.$anonfun$completePendingTxnOffsetCommit$2(GroupMetadata.scala:667)
        at 
kafka.utils.Implicits$MapExtensionMethods$.$anonfun$forKeyValue$1(Implicits.scala:62)
        at scala.collection.MapOps.foreachEntry(Map.scala:221)
        at scala.collection.MapOps.foreachEntry$(Map.scala:217)
        at scala.collection.AbstractMap.foreachEntry(Map.scala:381)
        at 
kafka.coordinator.group.GroupMetadata.$anonfun$completePendingTxnOffsetCommit$1(GroupMetadata.scala:664)
        at 
kafka.coordinator.group.GroupMetadata.completePendingTxnOffsetCommit(GroupMetadata.scala:663)
        at 
kafka.coordinator.group.GroupMetadataManager.$anonfun$handleTxnCompletion$2(GroupMetadataManager.scala:889)
        at 
kafka.coordinator.group.GroupMetadata.inLock(GroupMetadata.scala:228) {code}
 

 

> IllegalStateException when materializing transactional offset commits
> ---------------------------------------------------------------------
>
>                 Key: KAFKA-9350
>                 URL: https://issues.apache.org/jira/browse/KAFKA-9350
>             Project: Kafka
>          Issue Type: Bug
>    Affects Versions: 2.4.0
>            Reporter: Jason Gustafson
>            Assignee: Jason Gustafson
>            Priority: Major
>
> We have caught this exception a few times in the log:
> {code}
> java.lang.IllegalStateException: Trying to complete a transactional offset 
> commit for producerId 16031 and groupId foo even though the offset commit 
> record itself hasn't been appended to the log.
>       at 
> kafka.coordinator.group.GroupMetadata.$anonfun$completePendingTxnOffsetCommit$2(GroupMetadata.scala:595)
>       at 
> scala.collection.mutable.HashMap.$anonfun$foreach$1(HashMap.scala:149)
>       at scala.collection.mutable.HashTable.foreachEntry(HashTable.scala:237)
>       at scala.collection.mutable.HashTable.foreachEntry$(HashTable.scala:230)
>       at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:44)
>       at scala.collection.mutable.HashMap.foreach(HashMap.scala:149)
>       at 
> kafka.coordinator.group.GroupMetadata.$anonfun$completePendingTxnOffsetCommit$1(GroupMetadata.scala:592)
>       at 
> kafka.coordinator.group.GroupMetadata.$anonfun$completePendingTxnOffsetCommit$1$adapted(GroupMetadata.scala:591)
>       at scala.Option.foreach(Option.scala:274)
>       at 
> kafka.coordinator.group.GroupMetadata.completePendingTxnOffsetCommit(GroupMetadata.scala:591)
>       at 
> kafka.coordinator.group.GroupMetadataManager.$anonfun$handleTxnCompletion$2(GroupMetadataManager.scala:828)
>       at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
>       at kafka.coordinator.group.GroupMetadata.inLock(GroupMetadata.scala:209)
>       at 
> kafka.coordinator.group.GroupMetadataManager.$anonfun$handleTxnCompletion$1(GroupMetadataManager.scala:827)
>       at scala.collection.mutable.HashSet.foreach(HashSet.scala:79)
>       at 
> kafka.coordinator.group.GroupMetadataManager.handleTxnCompletion(GroupMetadataManager.scala:824)
>       at 
> kafka.coordinator.group.GroupMetadataManager.$anonfun$scheduleHandleTxnCompletion$1(GroupMetadataManager.scala:819)
>       at 
> kafka.utils.KafkaScheduler.$anonfun$schedule$2(KafkaScheduler.scala:116)
>       at kafka.utils.CoreUtils$$anon$1.run(CoreUtils.scala:65)
>       at 
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
>       at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>       at 
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>       at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>       at java.base/java.lang.Thread.run(Thread.java:834)
> {code}
> It seems that the end transaction marker callback is getting triggered before 
> the offset commit callback. This is puzzling because transaction completion 
> should be tied to a successful TxnOffsetCommit response which depends on 
> completion of the offset commit callback. So it's possible either that there 
> is some case we're missing in the broker or there is some bug in the client. 
> I looked through the logic on both sides and there is no obvious problem.
> In any case, it probably makes sense to let the broker behave more 
> defensively since there is no guarantee that a client won't send EndTxn 
> before receiving a successful TxnOffsetCommit response.
> Note the impact of this bug would tend to not be noticed because usually 
> there is a subsequent offset commit which succeeds. However, in the worst 
> case, it can violate EOS guarantees because it could cause the consumer to 
> revert to a previously committed offset.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to