kafka-jira mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Seweryn Habdank-Wojewodzki (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (KAFKA-4366) KafkaStreams.close() blocks indefinitely
Date Tue, 05 Sep 2017 09:46:00 GMT

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

Seweryn Habdank-Wojewodzki commented on KAFKA-4366:


* If I will use close(...) with timeout, could it be the case, that I am losing messages?
* What exactly is happening, when timeout is reached?
* What are the consequences of calling close(...) with timeout?
* I had also problems with hanging close(), which in background is calling close(0), but why
it can hangs?

Thanks in advance for ansers :-).

> 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:,
>            Reporter: Michal Borowiecki
>            Assignee: Damian Guy
>             Fix For:
>         Attachments: threadDump.log
> 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-
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

View raw message