Ensure we not complete the same promise that may be failed because of outbound handler exception.
Motivation: It's important that we do not pass in the original ChannelPromise to safeClose(...) as when flush(...) will throw an Exception it will be propagated to the AbstractChannelHandlerContext which will try to fail the promise because of this. This will then fail as it was already completed by safeClose(...). Modifications: Create a new ChannelPromise and pass it to safeClose(...). Result: No more confusing logs because of failing to fail the promise.
This commit is contained in:
parent
d1c8b099a5
commit
6dbec4181c
@ -1292,7 +1292,16 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
|
|||||||
try {
|
try {
|
||||||
flush(ctx, closeNotifyPromise);
|
flush(ctx, closeNotifyPromise);
|
||||||
} finally {
|
} finally {
|
||||||
safeClose(ctx, closeNotifyPromise, promise);
|
// It's important that we do not pass the original ChannelPromise to safeClose(...) as when flush(....)
|
||||||
|
// throws an Exception it will be propagated to the AbstractChannelHandlerContext which will try
|
||||||
|
// to fail the promise because of this. This will then fail as it was already completed by safeClose(...).
|
||||||
|
// We create a new ChannelPromise and try to notify the original ChannelPromise
|
||||||
|
// once it is complete. If we fail to do so we just ignore it as in this case it was failed already
|
||||||
|
// because of a propagated Exception.
|
||||||
|
//
|
||||||
|
// See https://github.com/netty/netty/issues/5931
|
||||||
|
safeClose(ctx, closeNotifyPromise, ctx.newPromise().addListener(
|
||||||
|
new ChannelPromiseNotifier(false, promise)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user