You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by "Dong Lin (JIRA)" <ji...@apache.org> on 2015/06/03 00:51:50 UTC

[jira] [Updated] (KAFKA-2241) AbstractFetcherThread.shutdown() should not block on ReadableByteChannel.read(buffer)

     [ https://issues.apache.org/jira/browse/KAFKA-2241?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dong Lin updated KAFKA-2241:
----------------------------
    Attachment: client.java
                server.java

Run server before client. Then check if channel.read() will unblock after the thread is interrupted.

> AbstractFetcherThread.shutdown() should not block on ReadableByteChannel.read(buffer)
> -------------------------------------------------------------------------------------
>
>                 Key: KAFKA-2241
>                 URL: https://issues.apache.org/jira/browse/KAFKA-2241
>             Project: Kafka
>          Issue Type: Bug
>            Reporter: Dong Lin
>            Assignee: Dong Lin
>         Attachments: client.java, server.java
>
>
> This is likely a bug from Java. This affects Kafka and here is the patch to fix it.
> Here is the description of the bug. By description of SocketChannel in Java 7 Documentation. If another thread interrupts the current thread while the read operation is in progress, the it should closes the channel and throw ClosedByInterruptException. However, we find that interrupting the thread will not unblock the channel immediately. Instead, it waits for response or socket timeout before throwing an exception.
> This will cause problem in the following scenario. Suppose one console_consumer_1 is reading from a topic, and due to quota delay or whatever reason, it block on channel.read(buffer). At this moment, another console_consumer_2 joins and triggers rebalance at console_consumer_1. But consumer_1 will block waiting on the channel.read before it can release partition ownership, causing consumer_2 to fail after a number of failed attempts to obtain partition ownership.
> In other words, AbstractFetcherThread.shutdown() is not guaranteed to shutdown due to this bug.
> The problem is confirmed with Java 1.7 and java 1.6. To check it by yourself, you can use the attached server.java and client.java -- start the server before the client and see if client unblock after interruption.



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