Skip to content

Commit 2c74da4

Browse files
committed
Fix read timeout scheduling, close AsyncHttpClient#1203
1 parent 12584f1 commit 2c74da4

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

client/src/main/java/org/asynchttpclient/netty/channel/DefaultChannelPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ public void run(Timeout timeout) throws Exception {
224224

225225
if (LOGGER.isDebugEnabled()) {
226226
long duration = unpreciseMillisTime() - start;
227-
LOGGER.debug("Closed {} connections out of {} in {}ms", closedCount, totalCount, duration);
227+
LOGGER.debug("Closed {} connections out of {} in {} ms", closedCount, totalCount, duration);
228228
}
229229

230230
scheduleNewIdleChannelDetector(timeout.task());

client/src/main/java/org/asynchttpclient/netty/timeout/RequestTimeoutTimerTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void run(Timeout timeout) throws Exception {
4343
if (nettyResponseFuture.isDone())
4444
return;
4545

46-
String message = "Request timeout to " + timeoutsHolder.remoteAddress() + " after " + requestTimeout + "ms";
46+
String message = "Request timeout to " + timeoutsHolder.remoteAddress() + " after " + requestTimeout + " ms";
4747
long age = unpreciseMillisTime() - nettyResponseFuture.getStart();
4848
expire(message, age);
4949
}

client/src/main/java/org/asynchttpclient/netty/timeout/TimeoutsHolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void startReadTimeout() {
7171
}
7272

7373
void startReadTimeout(ReadTimeoutTimerTask task) {
74-
if (requestTimeout == null || (!requestTimeout.isExpired() && readTimeoutValue > (requestTimeoutMillisTime - unpreciseMillisTime()))) {
74+
if (requestTimeout == null || (!requestTimeout.isExpired() && readTimeoutValue < (requestTimeoutMillisTime - unpreciseMillisTime()))) {
7575
// only schedule a new readTimeout if the requestTimeout doesn't happen first
7676
if (task == null) {
7777
// first call triggered from outside (else is read timeout is re-scheduling itself)

client/src/test/java/org/asynchttpclient/PerRequestTimeoutTest.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@
4343
public class PerRequestTimeoutTest extends AbstractBasicTest {
4444
private static final String MSG = "Enough is enough.";
4545

46-
private void checkTimeoutMessage(String message) {
47-
assertTrue(message.startsWith("Request timeout"), "error message indicates reason of error but got: " + message);
46+
private void checkTimeoutMessage(String message, boolean requestTimeout) {
47+
if (requestTimeout)
48+
assertTrue(message.startsWith("Request timeout"), "error message indicates reason of error but got: " + message);
49+
else
50+
assertTrue(message.startsWith("Read timeout"), "error message indicates reason of error but got: " + message);
4851
assertTrue(message.contains("localhost"), "error message contains remote host address but got: " + message);
49-
assertTrue(message.contains("after 100ms"), "error message contains timeout configuration value but got: " + message);
52+
assertTrue(message.contains("after 100 ms"), "error message contains timeout configuration value but got: " + message);
5053
}
5154

5255
@Override
@@ -100,7 +103,23 @@ public void testRequestTimeout() throws IOException {
100103
fail("Interrupted.", e);
101104
} catch (ExecutionException e) {
102105
assertTrue(e.getCause() instanceof TimeoutException);
103-
checkTimeoutMessage(e.getCause().getMessage());
106+
checkTimeoutMessage(e.getCause().getMessage(), true);
107+
} catch (TimeoutException e) {
108+
fail("Timeout.", e);
109+
}
110+
}
111+
112+
@Test(groups = "standalone")
113+
public void testReadTimeout() throws IOException {
114+
try (AsyncHttpClient client = asyncHttpClient(config().setReadTimeout(100))) {
115+
Future<Response> responseFuture = client.prepareGet(getTargetUrl()).execute();
116+
Response response = responseFuture.get(2000, TimeUnit.MILLISECONDS);
117+
assertNull(response);
118+
} catch (InterruptedException e) {
119+
fail("Interrupted.", e);
120+
} catch (ExecutionException e) {
121+
assertTrue(e.getCause() instanceof TimeoutException);
122+
checkTimeoutMessage(e.getCause().getMessage(), false);
104123
} catch (TimeoutException e) {
105124
fail("Timeout.", e);
106125
}
@@ -116,7 +135,7 @@ public void testGlobalDefaultPerRequestInfiniteTimeout() throws IOException {
116135
fail("Interrupted.", e);
117136
} catch (ExecutionException e) {
118137
assertTrue(e.getCause() instanceof TimeoutException);
119-
checkTimeoutMessage(e.getCause().getMessage());
138+
checkTimeoutMessage(e.getCause().getMessage(), true);
120139
}
121140
}
122141

@@ -130,7 +149,7 @@ public void testGlobalRequestTimeout() throws IOException {
130149
fail("Interrupted.", e);
131150
} catch (ExecutionException e) {
132151
assertTrue(e.getCause() instanceof TimeoutException);
133-
checkTimeoutMessage(e.getCause().getMessage());
152+
checkTimeoutMessage(e.getCause().getMessage(), true);
134153
} catch (TimeoutException e) {
135154
fail("Timeout.", e);
136155
}

0 commit comments

Comments
 (0)