Dong Lin created KAFKA-2241:
-------------------------------

             Summary: 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


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)

Reply via email to