Remove extra field from ChunkedWriteHandler to make it less error-prone (#9958)

Motivation:

At the moment we use an extra field in ChunedWriteHandler to hold the current write. This is not needed and makes sense even more error-prone. We can just peek in the queue.

Modifications:

Use Queue.peek() to keep track of current write

Result:

Less error-prone code
This commit is contained in:
Norman Maurer 2020-01-21 07:44:04 -08:00
parent 9e29c39daa
commit dce7157be9

View File

@ -70,7 +70,6 @@ public class ChunkedWriteHandler implements ChannelHandler {
private final Queue<PendingWrite> queue = new ArrayDeque<>();
private volatile ChannelHandlerContext ctx;
private PendingWrite currentWrite;
public ChunkedWriteHandler() {
}
@ -142,13 +141,7 @@ public class ChunkedWriteHandler implements ChannelHandler {
private void discard(Throwable cause) {
for (;;) {
PendingWrite currentWrite = this.currentWrite;
if (this.currentWrite == null) {
currentWrite = queue.poll();
} else {
this.currentWrite = null;
}
PendingWrite currentWrite = queue.poll();
if (currentWrite == null) {
break;
@ -198,9 +191,7 @@ public class ChunkedWriteHandler implements ChannelHandler {
boolean requiresFlush = true;
ByteBufAllocator allocator = ctx.alloc();
while (channel.isWritable()) {
if (currentWrite == null) {
currentWrite = queue.poll();
}
final PendingWrite currentWrite = queue.peek();
if (currentWrite == null) {
break;
@ -216,11 +207,10 @@ public class ChunkedWriteHandler implements ChannelHandler {
// as this had to be done already by someone who resolved the
// promise (using ChunkedInput.close method).
// See https://github.com/netty/netty/issues/8700.
this.currentWrite = null;
queue.remove();
continue;
}
final PendingWrite currentWrite = this.currentWrite;
final Object pendingMessage = currentWrite.msg;
if (pendingMessage instanceof ChunkedInput) {
@ -239,7 +229,7 @@ public class ChunkedWriteHandler implements ChannelHandler {
suspend = false;
}
} catch (final Throwable t) {
this.currentWrite = null;
queue.remove();
if (message != null) {
ReferenceCountUtil.release(message);
@ -265,7 +255,7 @@ public class ChunkedWriteHandler implements ChannelHandler {
ChannelFuture f = ctx.write(message);
if (endOfInput) {
this.currentWrite = null;
queue.remove();
// Register a listener which will close the input once the write is complete.
// This is needed because the Chunk may have some resource bound that can not
@ -312,7 +302,7 @@ public class ChunkedWriteHandler implements ChannelHandler {
ctx.flush();
requiresFlush = false;
} else {
this.currentWrite = null;
queue.remove();
ctx.write(pendingMessage, currentWrite.promise);
requiresFlush = true;
}