Avoid unnecessary IllegalStateException in ChunkedWriteHandler
Motivation: ChunkedWriteHandler can sometimes fail to write the last chunk of a ChunkedInput due to an I/O error. Subsequently, the ChunkedInput's associated promise is marked as failure and the connection is closed. When the connection is closed, ChunkedWriteHandler attempts to clean up its message queue and to mark their promises as success or failure. However, because the promise of the ChunkedInput, which was consumed completely yet failed to be written, is already marked as failure, the attempt to mark it as success fails, leading a WARN level log. Modification: Use trySuccess() instead of setSuccess() so that the attempt to mark a ChunkedInput as success does not raise an exception even if the promise is already done. Result: Fixes #2249
This commit is contained in:
parent
97f120330b
commit
3f2d3c9f1d
@ -338,17 +338,21 @@ public class ChunkedWriteHandler extends ChannelHandlerAdapter {
|
||||
|
||||
void fail(Throwable cause) {
|
||||
ReferenceCountUtil.release(msg);
|
||||
if (promise != null) {
|
||||
promise.tryFailure(cause);
|
||||
}
|
||||
promise.tryFailure(cause);
|
||||
}
|
||||
|
||||
void success() {
|
||||
if (promise.isDone()) {
|
||||
// No need to notify the progress or fulfill the promise because it's done already.
|
||||
return;
|
||||
}
|
||||
|
||||
if (promise instanceof ChannelProgressivePromise) {
|
||||
// Now we know what the total is.
|
||||
((ChannelProgressivePromise) promise).tryProgress(progress, progress);
|
||||
}
|
||||
promise.setSuccess();
|
||||
|
||||
promise.trySuccess();
|
||||
}
|
||||
|
||||
void progress(int amount) {
|
||||
|
Loading…
Reference in New Issue
Block a user