[
https://issues.apache.org/jira/browse/KAFKA-13663?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18063133#comment-18063133
]
Yu Xiao commented on KAFKA-13663:
---------------------------------
Whats kafka client version fixed this?
> 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)