[jira] [Assigned] (KAFKA-15205) Race condition in ShutdownableThread causes InterruptedException
[ https://issues.apache.org/jira/browse/KAFKA-15205?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Tanay Karmarkar reassigned KAFKA-15205: --- Assignee: Tanay Karmarkar > Race condition in ShutdownableThread causes InterruptedException > > > Key: KAFKA-15205 > URL: https://issues.apache.org/jira/browse/KAFKA-15205 > Project: Kafka > Issue Type: Bug > Components: core >Affects Versions: 3.3.2, 3.4.1, 3.6.0, 3.5.1 >Reporter: Divij Vaidya >Assignee: Tanay Karmarkar >Priority: Major > Fix For: 3.6.0 > > > In Shutdownable thread, during close, we call: > initiateShutdown() -> which may interrupt the thread if > isInterruptible is set to true during construction. > After that, we wait for proper shutdown using > awaitShutdown() which in-turn calls CountdownLatch#await(). On interruption, > which could be caused by initiateShutdown() earlier, await() throws an > InterruptedExeception. Hence, awaitShutdown() is going to exit by throwing an > interrupted exception. > The sequence to reproduce this will be as follows: > App-thread: Name of application thread which spawns and closes Shutdownable > thread > Shut-thread: Name of the shutdownable thread. > 1. App-thread calls ShutThread.initiateShutdown() > 2. ShutThread.interrupt() is called. It informs the VM to interrupt but the > actual interrupt will be async. initiateShutdown() from step 1 returns. > 3. App-thread calls ShutThread.awaitShutdown() > 4. App-thread waits on shutdownComplete.await() i.e. on CountdownLatch#await > 5. VM decides to interrupt App-thread and there is a race condition now. > Race condition: > Condition 1: Shut-thread.doWork() gets interrupted exception, and decrements > the CountdownLatch > Condition 2: App-thread waiting on Shut-thread.shutdownComplete.await() > throws an interruptedException as per the contract > [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html#await--] > *Solution* > > In ShutDownableThread#awaitShutdown(), when calling await() we should catch > InterruptedException and eat it up (do nothing), if the thread has > isInterruptable set to true. -- This message was sent by Atlassian Jira (v8.20.10#820010)
[jira] [Assigned] (KAFKA-15205) Race condition in ShutdownableThread causes InterruptedException
[ https://issues.apache.org/jira/browse/KAFKA-15205?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Tanay Karmarkar reassigned KAFKA-15205: --- Assignee: (was: Tanay Karmarkar) > Race condition in ShutdownableThread causes InterruptedException > > > Key: KAFKA-15205 > URL: https://issues.apache.org/jira/browse/KAFKA-15205 > Project: Kafka > Issue Type: Bug > Components: core >Affects Versions: 3.3.2, 3.4.1, 3.6.0, 3.5.1 >Reporter: Divij Vaidya >Priority: Major > Fix For: 3.6.0 > > > In Shutdownable thread, during close, we call: > initiateShutdown() -> which may interrupt the thread if > isInterruptible is set to true during construction. > After that, we wait for proper shutdown using > awaitShutdown() which in-turn calls CountdownLatch#await(). On interruption, > which could be caused by initiateShutdown() earlier, await() throws an > InterruptedExeception. Hence, awaitShutdown() is going to exit by throwing an > interrupted exception. > The sequence to reproduce this will be as follows: > App-thread: Name of application thread which spawns and closes Shutdownable > thread > Shut-thread: Name of the shutdownable thread. > 1. App-thread calls ShutThread.initiateShutdown() > 2. ShutThread.interrupt() is called. It informs the VM to interrupt but the > actual interrupt will be async. initiateShutdown() from step 1 returns. > 3. App-thread calls ShutThread.awaitShutdown() > 4. App-thread waits on shutdownComplete.await() i.e. on CountdownLatch#await > 5. VM decides to interrupt App-thread and there is a race condition now. > Race condition: > Condition 1: Shut-thread.doWork() gets interrupted exception, and decrements > the CountdownLatch > Condition 2: App-thread waiting on Shut-thread.shutdownComplete.await() > throws an interruptedException as per the contract > [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html#await--] > *Solution* > > In ShutDownableThread#awaitShutdown(), when calling await() we should catch > InterruptedException and eat it up (do nothing), if the thread has > isInterruptable set to true. -- This message was sent by Atlassian Jira (v8.20.10#820010)