From 25607c0d8300e77cb96fe166cec066d6245d43a4 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 15 Apr 2020 09:08:19 +0200 Subject: [PATCH] CodecOutputList should be recycled in a finally block (#10186) Motivation: To ensure we always recycle the CodecOutputList we should better do it in a finally block Modifications: Call CodecOutputList.recycle() in finally Result: Less chances of non-recycled lists. Related to https://github.com/netty/netty/issues/10183 --- .../codec/MessageToMessageEncoder.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java index bfad9eb32d..e2ea123a20 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java @@ -92,9 +92,6 @@ public abstract class MessageToMessageEncoder extends ChannelHandlerAdapter { } if (out.isEmpty()) { - out.recycle(); - out = null; - throw new EncoderException( StringUtil.simpleClassName(this) + " must produce at least one message."); } @@ -107,19 +104,22 @@ public abstract class MessageToMessageEncoder extends ChannelHandlerAdapter { throw new EncoderException(t); } finally { if (out != null) { - final int sizeMinusOne = out.size() - 1; - if (sizeMinusOne == 0) { - ctx.write(out.getUnsafe(0), promise); - } else if (sizeMinusOne > 0) { - // Check if we can use a voidPromise for our extra writes to reduce GC-Pressure - // See https://github.com/netty/netty/issues/2525 - if (promise == ctx.voidPromise()) { - writeVoidPromise(ctx, out); - } else { - writePromiseCombiner(ctx, out, promise); + try { + final int sizeMinusOne = out.size() - 1; + if (sizeMinusOne == 0) { + ctx.write(out.getUnsafe(0), promise); + } else if (sizeMinusOne > 0) { + // Check if we can use a voidPromise for our extra writes to reduce GC-Pressure + // See https://github.com/netty/netty/issues/2525 + if (promise == ctx.voidPromise()) { + writeVoidPromise(ctx, out); + } else { + writePromiseCombiner(ctx, out, promise); + } } + } finally { + out.recycle(); } - out.recycle(); } } }