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
d838a07c14
commit
5c27273885
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user