You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by "Michal Borowiecki (JIRA)" <ji...@apache.org> on 2016/11/02 10:02:59 UTC

[jira] [Created] (KAFKA-4366) KafkaStreams.close() blocks indefinitely

Michal Borowiecki created KAFKA-4366:
----------------------------------------

             Summary: KafkaStreams.close() blocks indefinitely
                 Key: KAFKA-4366
                 URL: https://issues.apache.org/jira/browse/KAFKA-4366
             Project: Kafka
          Issue Type: Bug
          Components: streams
    Affects Versions: 0.10.0.1, 0.10.1.0
            Reporter: Michal Borowiecki
            Assignee: Guozhang Wang


KafkaStreams.close() method calls join on all its threads without a timeout, meaning indefinitely, which makes it prone to deadlocks and unfit to be used in shutdown hooks.

(KafkaStreams::close is used in numerous examples by confluent: https://github.com/confluentinc/examples/tree/kafka-0.10.0.1-cp-3.0.1/kafka-streams/src/main/java/io/confluent/examples/streams and https://www.confluent.io/blog/introducing-kafka-streams-stream-processing-made-simple/ so we assumed it to be recommended practice)

A deadlock happens, for instance, if System.exit() is called from within the uncaughtExceptionHandler. (We need to call System.exit() from the uncaughtExceptionHandler because KAFKA-4355 issue shuts down the StreamThread and to recover we want the process to exit, as our infrastructure will then start it up again.)

The System.exit call (from the uncaughtExceptionHandler, which runs in the StreamThread) will execute the shutdown hook in a new thread and wait for that thread to join. If the shutdown hook calls KafkaStreams.close, it will in turn block waiting for the StreamThread to join, hence the deadlock.

Runtime.addShutdownHook javadocs state:
{quote}
Shutdown hooks run at a delicate time in the life cycle of a virtual machine and should therefore be coded defensively. They should, in particular, be written to be thread-safe and to avoid deadlocks insofar as possible
{quote}
and
{quote}
Shutdown hooks should also finish their work quickly.
{quote}
Therefore the current implementation of KafkaStreams.close() which waits forever for threads to join is completely unsuitable for use in a shutdown hook. 





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)