Bart De Vylder created KAFKA-6026:
-------------------------------------
Summary: Timeout on KafkaFuture not honoured
Key: KAFKA-6026
URL: https://issues.apache.org/jira/browse/KAFKA-6026
Project: Kafka
Issue Type: Bug
Components: admin
Affects Versions: 0.11.0.0
Reporter: Bart De Vylder
I would expect the following code to raise an Exception, either in the
adminClient creation or a TimeoutException when getting the future (there is no
kafka running on localhost on that port).
{code:java}
Properties config = new Properties();
config.setProperty("bootstrap.servers", "localhost:1234");
AdminClient admin = AdminClient.create(config);
admin.listTopics().names().get(1, TimeUnit.SECONDS);
{code}
The code however seems to hang forever in the last step.
A possible cause for the behavior might be a bug in the KafkaFutureImpl class:
{code:java}
private static class SingleWaiter<R> extends BiConsumer<R, Throwable> {
[...]
R await(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException,
TimeoutException {
long startMs = System.currentTimeMillis();
long waitTimeMs = (unit.toMillis(timeout) > 0) ?
unit.toMillis(timeout) : 1;
long delta = 0;
synchronized (this) {
while (true) {
if (exception != null)
wrapAndThrow(exception);
if (done)
return value;
if (delta > waitTimeMs) {
throw new TimeoutException();
}
this.wait(waitTimeMs - delta);
delta = System.currentTimeMillis() - startMs;
}
}
}
{code}
While debugging I observed {{waitTimeMs}} and {{delta}} to become equal after
one iteration, giving a {{this.wait(0)}} in the next iteration, which according
to the documentation
http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-
results in an indefinite wait.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)