Skip to content

Commit 5c63a97

Browse files
author
Stephane Landelle
committed
Clean up TimeoutTasks content when cancelling, close #682
1 parent 3489bcf commit 5c63a97

File tree

3 files changed

+12
-1
lines changed

3 files changed

+12
-1
lines changed

src/main/java/com/ning/http/client/providers/netty/handler/Processor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws
178178
}
179179
}
180180

181+
// FIXME how does recovery occur?!
181182
if (StackTraceInspector.abortOnReadOrWriteException(cause)) {
182183
LOGGER.debug("Trying to recover from dead Channel: {}", channel);
183184
return;

src/main/java/com/ning/http/client/providers/netty/request/timeout/TimeoutTimerTask.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public abstract class TimeoutTimerTask implements TimerTask {
2525

2626
private static final Logger LOGGER = LoggerFactory.getLogger(TimeoutTimerTask.class);
2727

28-
protected final NettyResponseFuture<?> nettyResponseFuture;
28+
protected volatile NettyResponseFuture<?> nettyResponseFuture;
2929
protected final NettyRequestSender requestSender;
3030
protected final TimeoutsHolder timeoutsHolder;
3131

@@ -39,4 +39,12 @@ protected void expire(String message, long time) {
3939
LOGGER.debug("{} for {} after {} ms", message, nettyResponseFuture, time);
4040
requestSender.abort(nettyResponseFuture, new TimeoutException(message));
4141
}
42+
43+
/**
44+
* When the timeout is cancelled, it could still be referenced for quite some time in the Timer.
45+
* Holding a reference to the future might mean holding a reference to the channel, and heavy objects such as SslEngines
46+
*/
47+
public void clean() {
48+
nettyResponseFuture = null;
49+
}
4250
}

src/main/java/com/ning/http/client/providers/netty/request/timeout/TimeoutsHolder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ public void cancel() {
2626
if (cancelled.compareAndSet(false, true)) {
2727
if (requestTimeout != null) {
2828
requestTimeout.cancel();
29+
RequestTimeoutTimerTask.class.cast(requestTimeout.getTask()).clean();
2930
requestTimeout = null;
3031
}
3132
if (readTimeout != null) {
3233
readTimeout.cancel();
34+
ReadTimeoutTimerTask.class.cast(readTimeout.getTask()).clean();
3335
readTimeout = null;
3436
}
3537
}

0 commit comments

Comments
 (0)