Stig Rohde Døssing created KAFKA-4387:
-----------------------------------------

             Summary: KafkaConsumer will enter an infinite loop if the polling 
thread is interrupted, and either commitSync or committed is called
                 Key: KAFKA-4387
                 URL: https://issues.apache.org/jira/browse/KAFKA-4387
             Project: Kafka
          Issue Type: Bug
          Components: clients
    Affects Versions: 0.10.0.1
            Reporter: Stig Rohde Døssing
            Assignee: Stig Rohde Døssing


When the KafkaConsumer.commitSync method is called, the 
ConsumerNetworkClient.poll(RequestFuture<?> future) method will be called with 
a future that only finishes when the commit request completes, or the request 
times out.

When the calling thread is interrupted, every call to the Selector underlying 
the ConsumerNetworkClient will return immediately, while thread interrupt state 
is not reset. The call to poll ends up looping until the request timeout, at 
which point it drops back out to ConsumerCoordinator.commitOffsetsSync which 
retries the request because TimeoutException is retriable. This repeats 
indefinitely. 

For the same reason as in https://issues.apache.org/jira/browse/KAFKA-4375, it 
is good if the KafkaConsumer can handle interrupts in a reasonable way, rather 
than having wakeup() be the only way to properly stop a consumer thread.

I think making ConsumerNetworkClient.maybeTriggerWakeup() throw a 
WakeupException if the calling thread is interrupted makes sense, since an 
interrupted thread won't be making progress in polling due to the way Selector 
works, and KafkaConsumer users then don't have to handle wakeups and interrupts 
separately.



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

Reply via email to