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:
Trustin Lee 2014-02-20 17:14:25 -08:00
parent d838a07c14
commit 5c27273885

View File

@ -339,17 +339,21 @@ public class ChunkedWriteHandler
void fail(Throwable cause) { void fail(Throwable cause) {
ReferenceCountUtil.release(msg); ReferenceCountUtil.release(msg);
if (promise != null) { promise.tryFailure(cause);
promise.tryFailure(cause);
}
} }
void success() { 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) { if (promise instanceof ChannelProgressivePromise) {
// Now we know what the total is. // Now we know what the total is.
((ChannelProgressivePromise) promise).tryProgress(progress, progress); ((ChannelProgressivePromise) promise).tryProgress(progress, progress);
} }
promise.setSuccess();
promise.trySuccess();
} }
void progress(int amount) { void progress(int amount) {