You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "Ismael Juma (Jira)" <ji...@apache.org> on 2023/01/21 09:45:00 UTC

[jira] [Resolved] (KAFKA-13663) IllegalMonitorStateException in ProducerMetadata.awaitUpdate

     [ https://issues.apache.org/jira/browse/KAFKA-13663?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ismael Juma resolved KAFKA-13663.
---------------------------------
    Resolution: Duplicate

Marking as duplicate of KAFKA-10902 since that has a reference to the JDK bug.

> IllegalMonitorStateException in ProducerMetadata.awaitUpdate
> ------------------------------------------------------------
>
>                 Key: KAFKA-13663
>                 URL: https://issues.apache.org/jira/browse/KAFKA-13663
>             Project: Kafka
>          Issue Type: Bug
>          Components: clients
>    Affects Versions: 3.0.0
>            Reporter: RivenSun
>            Assignee: Guozhang Wang
>            Priority: Major
>
> Since our service kafka-clients was upgraded to {*}2.8.1{*}, sometimes the producer will throw an exception when sending a message, and once this exception occurs, it will continue and will not recover by itself.
> {code:java}
> java.lang.IllegalMonitorStateException: current thread is not owner
>         at java.base/java.lang.Object.wait(Native Method)
>         at org.apache.kafka.common.utils.SystemTime.waitObject(SystemTime.java:55)
>         at org.apache.kafka.clients.producer.internals.ProducerMetadata.awaitUpdate(ProducerMetadata.java:119)
>         at org.apache.kafka.clients.producer.KafkaProducer.waitOnMetadata(KafkaProducer.java:1047)
>         at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:906)
>         at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:885)
>  {code}
>  
>  
> The version of kafka-clients used before is {*}2.2.2{*}, and this exception has never occurred
> Comparing the changes in the kafkaClient source code, I found that there is a change, it is very likely that this is a *regression bug.*
> In version 2.2.2, the `Metadata#awaitUpdate` method is called in `KafkaProducer#waitOnMetadata`
> But since version {*}2.3.0{*}, `ProducerMetadata#awaitUpdate` is called in `KafkaProducer#waitOnMetadata`
> The most crucial point is:
> `Object#wait(long timeoutMillis)` method,
> In the `Metadata#awaitUpdate` method, thread safety is ensured by the `synchronized` keyword on the `Metadata#awaitUpdate` method;
> In the `ProducerMetadata#awaitUpdate` method, in addition to the `synchronized` on the `ProducerMetadata#awaitUpdate` method, {color:#FF0000}*there is a second `synchronized` in the `SystemTime#waitObject` method;*{color}
> Although we all know that `synchronized` is reentrant, it is not clear whether the implementation of `ProducerMetadata#awaitUpdate` is inconsistent in different versions of JDK, resulting in this exception; what is certain is that this exception has never occurred before the 2.2.2 version of KafkaProducer
>  
> h2. Suggestion:
> We can keep only one `synchronized` and remove the `synchronized` on the `ProducerMetadata#awaitUpdate` method



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