diff --git a/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java b/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java index 46bd380948..4455eb70b3 100644 --- a/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java @@ -279,21 +279,24 @@ public abstract class ByteToMessageDecoder extends ChannelInboundHandlerAdapter } catch (Exception e) { throw new DecoderException(e); } finally { - if (cumulation != null && !cumulation.isReadable()) { - numReads = 0; - cumulation.release(); - cumulation = null; - } else if (++ numReads >= discardAfterReads) { - // We did enough reads already try to discard some bytes so we not risk to see a OOME. - // See https://github.com/netty/netty/issues/4275 - numReads = 0; - discardSomeReadBytes(); - } + try { + if (cumulation != null && !cumulation.isReadable()) { + numReads = 0; + cumulation.release(); + cumulation = null; + } else if (++numReads >= discardAfterReads) { + // We did enough reads already try to discard some bytes so we not risk to see a OOME. + // See https://github.com/netty/netty/issues/4275 + numReads = 0; + discardSomeReadBytes(); + } - int size = out.size(); - firedChannelRead |= out.insertSinceRecycled(); - fireChannelRead(ctx, out, size); - out.recycle(); + int size = out.size(); + firedChannelRead |= out.insertSinceRecycled(); + fireChannelRead(ctx, out, size); + } finally { + out.recycle(); + } } } else { ctx.fireChannelRead(msg); diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java index ec828e2e32..595a2fabda 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageDecoder.java @@ -97,11 +97,14 @@ public abstract class MessageToMessageDecoder extends ChannelInboundHandlerAd } catch (Exception e) { throw new DecoderException(e); } finally { - int size = out.size(); - for (int i = 0; i < size; i ++) { - ctx.fireChannelRead(out.getUnsafe(i)); + try { + int size = out.size(); + for (int i = 0; i < size; i++) { + ctx.fireChannelRead(out.getUnsafe(i)); + } + } finally { + out.recycle(); } - out.recycle(); } } 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 439dc8cb19..ddb001a833 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 ChannelOutboundHandlerA } 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 ChannelOutboundHandlerA 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(); } } }