From 9c4bfa44d97f3056a7432539a032d47f8b6b7005 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 22 Apr 2013 11:04:56 +0200 Subject: [PATCH] [#1294] Make sure ByteBuf is released once written to channel --- .../codec/http/HttpContentDecoder.java | 3 +- .../codec/http/HttpContentEncoder.java | 3 +- .../handler/codec/compression/JZlibTest.java | 6 +- .../compression/SnappyFramedEncoderTest.java | 5 +- .../socket/SocketBufReleaseTest.java | 87 +++++++++++++++++++ .../socket/SocketFixedLengthEchoTest.java | 2 +- .../channel/DefaultChannelHandlerContext.java | 6 +- 7 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketBufReleaseTest.java diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java index 5137c8f368..eccb9547ad 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/HttpContentDecoder.java @@ -221,7 +221,8 @@ public abstract class HttpContentDecoder extends MessageToMessageDecoder { + + private final Random random = new Random(); + private final CountDownLatch latch = new CountDownLatch(1); + private ByteBuf buf; + @Override + public void channelActive(final ChannelHandlerContext ctx) throws Exception { + byte[] data = new byte[1024]; + random.nextBytes(data); + + buf = ctx.alloc().buffer(); + buf.writeBytes(data); + + ctx.channel().write(buf).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + latch.countDown(); + } + }); + } + + @Override + public void messageReceived(ChannelHandlerContext ctx, Object msg) throws Exception { + // Discard + } + + public void check() throws InterruptedException { + latch.await(); + assertEquals(0, buf.refCnt()); + } + } +} diff --git a/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketFixedLengthEchoTest.java b/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketFixedLengthEchoTest.java index 4cf343ac2c..206406dd09 100644 --- a/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketFixedLengthEchoTest.java +++ b/testsuite/src/test/java/io/netty/testsuite/transport/socket/SocketFixedLengthEchoTest.java @@ -149,7 +149,7 @@ public class SocketFixedLengthEchoTest extends AbstractSocketTest { } if (channel.parent() != null) { - channel.write(msg); + channel.write(msg.retain()); } counter += actual.length; diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java b/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java index 227a2d2791..c40c1d0b2d 100755 --- a/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelHandlerContext.java @@ -1413,7 +1413,11 @@ final class DefaultChannelHandlerContext extends DefaultAttributeMap implements outboundMessageBuffer().add(message); } else { ByteBuf buf = (ByteBuf) message; - outboundByteBuffer().writeBytes(buf, buf.readerIndex(), buf.readableBytes()); + try { + outboundByteBuffer().writeBytes(buf, buf.readerIndex(), buf.readableBytes()); + } finally { + buf.release(); + } } invokeFlush0(promise); }