Skip to content

Commit 5a8bb5a

Browse files
committed
Use currentTimeMillis for timeouts, close AsyncHttpClient#1162
1 parent ec14c81 commit 5a8bb5a

File tree

8 files changed

+26
-25
lines changed

8 files changed

+26
-25
lines changed

client/src/main/java/org/asynchttpclient/netty/NettyResponseFuture.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
package org.asynchttpclient.netty;
1515

16-
import static org.asynchttpclient.util.DateUtils.millisTime;
16+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
1717
import static org.asynchttpclient.util.MiscUtils.getCause;
1818
import static io.netty.util.internal.PlatformDependent.*;
1919
import io.netty.channel.Channel;
@@ -62,7 +62,7 @@ public final class NettyResponseFuture<V> extends AbstractListenableFuture<V> {
6262
// FIXME see https://github.com/netty/netty/pull/4669
6363
private static final AtomicReferenceFieldUpdater<NettyResponseFuture, ExecutionException> EX_EX_UPDATER = newAtomicReferenceFieldUpdater(NettyResponseFuture.class, "exEx");
6464

65-
private final long start = millisTime();
65+
private final long start = unpreciseMillisTime();
6666
private final ChannelPoolPartitioning connectionPoolPartitioning;
6767
private final ProxyServer proxyServer;
6868
private final int maxRetry;
@@ -85,7 +85,7 @@ public final class NettyResponseFuture<V> extends AbstractListenableFuture<V> {
8585
private volatile ExecutionException exEx;
8686

8787
// volatile where we don't need CAS ops
88-
private volatile long touch = millisTime();
88+
private volatile long touch = unpreciseMillisTime();
8989
private volatile TimeoutsHolder timeoutsHolder;
9090
private volatile ChannelState channelState = ChannelState.NEW;
9191

@@ -254,7 +254,7 @@ public final void abort(final Throwable t) {
254254

255255
@Override
256256
public void touch() {
257-
touch = millisTime();
257+
touch = unpreciseMillisTime();
258258
}
259259

260260
@Override

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
package org.asynchttpclient.netty.channel;
1515

1616
import static org.asynchttpclient.util.Assertions.assertNotNull;
17-
import static org.asynchttpclient.util.DateUtils.millisTime;
17+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
1818
import io.netty.channel.Channel;
1919
import io.netty.channel.ChannelId;
2020
import io.netty.util.Timeout;
@@ -190,7 +190,7 @@ public void run(Timeout timeout) throws Exception {
190190
LOGGER.debug("Entry count for : {} : {}", key, partitions.get(key).size());
191191
}
192192

193-
long start = millisTime();
193+
long start = unpreciseMillisTime();
194194
int closedCount = 0;
195195
int totalCount = 0;
196196

@@ -215,7 +215,7 @@ public void run(Timeout timeout) throws Exception {
215215
}
216216

217217
if (LOGGER.isDebugEnabled()) {
218-
long duration = millisTime() - start;
218+
long duration = unpreciseMillisTime() - start;
219219
LOGGER.debug("Closed {} connections out of {} in {}ms", closedCount, totalCount, duration);
220220
}
221221

@@ -230,7 +230,7 @@ public boolean offer(Channel channel, Object partitionKey) {
230230
if (isClosed.get())
231231
return false;
232232

233-
long now = millisTime();
233+
long now = unpreciseMillisTime();
234234

235235
if (isTtlExpired(channel, now))
236236
return false;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
package org.asynchttpclient.netty.timeout;
1515

16-
import static org.asynchttpclient.util.DateUtils.millisTime;
16+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
1717
import io.netty.util.Timeout;
1818

1919
import org.asynchttpclient.netty.NettyResponseFuture;
@@ -42,7 +42,7 @@ public void run(Timeout timeout) throws Exception {
4242
return;
4343
}
4444

45-
long now = millisTime();
45+
long now = unpreciseMillisTime();
4646

4747
long currentReadTimeoutInstant = readTimeout + nettyResponseFuture.getLastTouch();
4848
long durationBeforeCurrentReadTimeout = currentReadTimeoutInstant - now;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
package org.asynchttpclient.netty.timeout;
1515

16-
import static org.asynchttpclient.util.DateUtils.millisTime;
16+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
1717
import io.netty.util.Timeout;
1818

1919
import org.asynchttpclient.netty.NettyResponseFuture;
@@ -44,7 +44,7 @@ public void run(Timeout timeout) throws Exception {
4444
return;
4545

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

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*/
1414
package org.asynchttpclient.netty.timeout;
1515

16-
import static org.asynchttpclient.util.DateUtils.millisTime;
16+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
1717
import io.netty.util.Timeout;
1818
import io.netty.util.Timer;
1919
import io.netty.util.TimerTask;
@@ -52,7 +52,7 @@ public TimeoutsHolder(Timer nettyTimer, NettyResponseFuture<?> nettyResponseFutu
5252
}
5353

5454
if (requestTimeoutInMs != -1) {
55-
requestTimeoutMillisTime = millisTime() + requestTimeoutInMs;
55+
requestTimeoutMillisTime = unpreciseMillisTime() + requestTimeoutInMs;
5656
requestTimeout = newTimeout(new RequestTimeoutTimerTask(nettyResponseFuture, requestSender, this, requestTimeoutInMs), requestTimeoutInMs);
5757
} else {
5858
requestTimeoutMillisTime = -1L;
@@ -71,7 +71,7 @@ public void startReadTimeout() {
7171
}
7272

7373
void startReadTimeout(ReadTimeoutTimerTask task) {
74-
if (requestTimeout == null || (!requestTimeout.isExpired() && readTimeoutValue > (requestTimeoutMillisTime - millisTime()))) {
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/main/java/org/asynchttpclient/util/DateUtils.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
/*
2-
* Copyright (c) 2010-2012 Sonatype, Inc. All rights reserved.
2+
* Copyright (c) 2015 AsyncHttpClient Project. All rights reserved.
33
*
44
* This program is licensed to you under the Apache License Version 2.0,
55
* and you may not use this file except in compliance with the Apache License Version 2.0.
6-
* You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at
7+
* http://www.apache.org/licenses/LICENSE-2.0.
78
*
89
* Unless required by applicable law or agreed to in writing,
910
* software distributed under the Apache License Version 2.0 is distributed on an
@@ -17,7 +18,7 @@ public final class DateUtils {
1718
private DateUtils() {
1819
}
1920

20-
public static long millisTime() {
21-
return System.nanoTime() / 1000000;
21+
public static long unpreciseMillisTime() {
22+
return System.currentTimeMillis();
2223
}
2324
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import static java.util.concurrent.TimeUnit.SECONDS;
2020
import static org.asynchttpclient.Dsl.*;
2121
import static org.asynchttpclient.test.TestUtils.*;
22-
import static org.asynchttpclient.util.DateUtils.millisTime;
22+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
2323
import static org.testng.Assert.*;
2424
import io.netty.handler.codec.http.DefaultHttpHeaders;
2525
import io.netty.handler.codec.http.HttpHeaders;
@@ -661,11 +661,11 @@ public void configRequestTimeoutHappensInDueTime() throws Throwable {
661661
h.add("X-Delay", 2_000);
662662

663663
server.enqueueEcho();
664-
long start = millisTime();
664+
long start = unpreciseMillisTime();
665665
try {
666666
client.prepareGet(getTargetUrl()).setHeaders(h).setUrl(getTargetUrl()).execute().get();
667667
} catch (Throwable ex) {
668-
final long elapsedTime = millisTime() - start;
668+
final long elapsedTime = unpreciseMillisTime() - start;
669669
assertTrue(elapsedTime >= 1_000 && elapsedTime <= 1_500);
670670
throw ex.getCause();
671671
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package org.asynchttpclient;
1717

1818
import static org.asynchttpclient.Dsl.*;
19-
import static org.asynchttpclient.util.DateUtils.millisTime;
19+
import static org.asynchttpclient.util.DateUtils.unpreciseMillisTime;
2020
import static org.testng.Assert.*;
2121

2222
import java.io.IOException;
@@ -149,13 +149,13 @@ public Response onCompleted(Response response) throws Exception {
149149

150150
@Override
151151
public State onBodyPartReceived(HttpResponseBodyPart content) throws Exception {
152-
times[0] = millisTime();
152+
times[0] = unpreciseMillisTime();
153153
return super.onBodyPartReceived(content);
154154
}
155155

156156
@Override
157157
public void onThrowable(Throwable t) {
158-
times[1] = millisTime();
158+
times[1] = unpreciseMillisTime();
159159
super.onThrowable(t);
160160
}
161161
});

0 commit comments

Comments
 (0)