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
b02531f0aa
commit
1884a5697c
@ -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