Divij Vaidya created KAFKA-15205:
------------------------------------

             Summary: ShutdownableThread
                 Key: KAFKA-15205
                 URL: https://issues.apache.org/jira/browse/KAFKA-15205
             Project: Kafka
          Issue Type: Bug
    Affects Versions: 3.4.1, 3.3.2, 3.6.0, 3.5.1
            Reporter: Divij Vaidya
             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)

Reply via email to