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

Liam Clarke-Hutchinson edited comment on KAFKA-13672 at 3/20/22, 4:53 AM:
--------------------------------------------------------------------------

I've renamed this issue (was Flaky test 
`kafka.server.DynamicBrokerReconfigurationTest.testThreadPoolResize()`) because 
the test was actually exposing a race condition in `DynamicBrokerConfig` that 
occurred when the broker under test was running sufficiently slowly. Many 
thanks are due to [~showuon] for all of his guidance and insight, and for 
identifying the root cause. 

`DynamicBrokerConfig` stores a mutable buffer of `Reconfigurable`s which are 
protected by a read lock and write lock. However, these locks can't prevent the 
issue this test was exposing in the CI environment, which is -  if a 
`Reconfigurable` is added by one thread while another thread is updating 
dynamic configs (which involves iterating over the buffer of `Reconfigurable`s) 
then this causes a `ConcurrentModificationException` for the thread that is 
iterating, thus preventing all dynamic configs from being updated.

I'll be submitting a PR shortly to guard against this race condition.


was (Author: JIRAUSER279886):
I've renamed this issue (was Flaky test 
`kafka.server.DynamicBrokerReconfigurationTest.testThreadPoolResize()`) because 
the test was actually exposing a race condition in `DynamicBrokerConfig` that 
occurred when the broker under test was running sufficiently slowly. Many 
thanks are due to [~showuon] for all of his guidance and insight in identifying 
this root cause.

`DynamicBrokerConfig` stores a mutable buffer of `Reconfigurable`s which are 
protected by a read lock and write lock. However, these locks can't prevent the 
issue this test was exposing in the CI environment, which is -  if a 
`Reconfigurable` is added by one thread while another thread is updating 
dynamic configs (which involves iterating over the buffer of `Reconfigurable`s) 
then this causes a `ConcurrentModificationException` for the thread that is 
iterating, thus preventing all dynamic configs from being updated.

I'll be submitting a PR shortly to guard against this race condition.

> Race condition in DynamicBrokerConfig
> -------------------------------------
>
>                 Key: KAFKA-13672
>                 URL: https://issues.apache.org/jira/browse/KAFKA-13672
>             Project: Kafka
>          Issue Type: Bug
>            Reporter: Bruno Cadonna
>            Assignee: Liam Clarke-Hutchinson
>            Priority: Blocker
>             Fix For: 3.2.0
>
>
> Stacktrace:
> {code:java}
> org.opentest4j.AssertionFailedError: expected: <2> but was: <1>
>       at 
> app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
>       at 
> app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)
>       at 
> app//org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:182)
>       at 
> app//org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:177)
>       at 
> app//org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:1141)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.$anonfun$waitForConfigOnServer$1(DynamicBrokerReconfigurationTest.scala:1500)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.waitForConfigOnServer(DynamicBrokerReconfigurationTest.scala:1500)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.$anonfun$waitForConfig$1(DynamicBrokerReconfigurationTest.scala:1495)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.$anonfun$waitForConfig$1$adapted(DynamicBrokerReconfigurationTest.scala:1495)
>       at app//scala.collection.IterableOnceOps.foreach(IterableOnce.scala:563)
>       at 
> app//scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:561)
>       at app//scala.collection.AbstractIterable.foreach(Iterable.scala:926)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.waitForConfig(DynamicBrokerReconfigurationTest.scala:1495)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.reconfigureServers(DynamicBrokerReconfigurationTest.scala:1440)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.resizeThreadPool$1(DynamicBrokerReconfigurationTest.scala:775)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.$anonfun$testThreadPoolResize$3(DynamicBrokerReconfigurationTest.scala:768)
>       at app//scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:190)
>       at 
> app//kafka.server.DynamicBrokerReconfigurationTest.testThreadPoolResize(DynamicBrokerReconfigurationTest.scala:784)
> {code}
> Job: 
> https://ci-builds.apache.org/job/Kafka/job/kafka-pr/job/PR-11751/5/testReport/



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to