Dong Lin created KAFKA-2240:
-------------------------------
Summary: AbstractFetcherThread.shutdown() should not block on
ReadableByteChannel.read(buffer)
Key: KAFKA-2240
URL: https://issues.apache.org/jira/browse/KAFKA-2240
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)