In this case you not need to call release... so all good

> Am 04.01.2017 um 13:23 schrieb Arnab Biswas <[email protected]>:
> 
> Hi Norman,
> 
> Thanks for your input.
> 
> My mistake was even more basic. I didn't release the ByteBuf in the ultimate 
> consumer (That happens to be the handler next to the decoder). Now that I 
> have released it in the handler, the memory leak is no longer there.
> 
> Regarding the decodeLast(), I do NOT want to invoke super.decodeLast(). Since 
> the goal of ReadTimeoutHttpResponseDecoder is to set a timer, I don't want to 
> do anything during the channelInactive event. But, in that case, do I need to 
> explicitly release the ByteBuffer within decodeLast()?
> 
>   @Override
>     protected void decodeLast(ChannelHandlerContext ctx, ByteBuf in, 
> List<Object> out) throws Exception {
>         log.trace("Connection has been closed, not attempting to decode 
> message");
>         //Is this needed?
>         in.release();
>     }
> 
> Or is it fine if I don't release it decodeLast? My test does NOT show any 
> memory leak even without the red code.
> 
> Thanks,
> Arnab
> 
>> On Mon, Jan 2, 2017 at 5:05 PM, 'Norman Maurer' via Netty discussions 
>> <[email protected]> wrote:
>> Most likely this is because you forgot to call super.decodeLast(....).
>> 
>> Beside this out will never be null but may be empty if there was nothing 
>> decoded 
>> 
>>> Am 02.01.2017 um 12:04 schrieb Arnab Biswas <[email protected]>:
>>> 
>>> 
>>> Hi,
>>> 
>>> In our product,  time out functionality is added to "HttpResponseDecoder". 
>>> The following is pseudo code (git gist is here). Within decode(), a timer 
>>> is set and then super.decode() invoked(). But this is resulting in memory 
>>> leak (Leak report below. Also the gist is here). 
>>> 
>>> If I do, "buffer.release()" at the end of decode() method it results in 
>>> "io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1"
>>> 
>>> Could you please help me here?
>>> 
>>> Thanks,
>>> Arnab
>>> 
>>> =============================================================================
>>> 
>>> public class ReadTimeoutHttpResponseDecoder extends HttpResponseDecoder {
>>> 
>>>     @Override
>>>     protected synchronized void decode(final ChannelHandlerContext ctx,
>>>             final ByteBuf buffer, final List<Object> out) throws Exception 
>>> { 
>>>         
>>>         if (this.timeout == null) {   
>>>             this.timeout = this.timer.newTimeout(
>>>                 new ReadTimeoutTask(ctx), this.readTimeoutMs, 
>>>                 TimeUnit.MILLISECONDS);
>>>         }
>>>         log.trace("Attempting to decode message");
>>>         super.decode(ctx, buffer, out);
>>>         if (out == null) {
>>>             log.trace("Still reading message");
>>>         } else {
>>>             log.trace("Message returned");
>>>             cancelTimeout();
>>>         }
>>>     }
>>> 
>>>     @Override
>>>     protected void decodeLast(ChannelHandlerContext ctx, ByteBuf in, 
>>> List<Object> out) throws Exception {
>>>         log.trace("Connection has been closed, not attempting to decode 
>>> message");
>>>     }
>>> 
>>> }
>>> 
>>> =============================================================================
>>> 
>>> 
>>> Recent access records: 4
>>> #4:
>>>     
>>> io.netty.buffer.AdvancedLeakAwareByteBuf.release(AdvancedLeakAwareByteBuf.java:61)
>>>     
>>> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:252)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:307)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:293)
>>>     
>>> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:840)
>>>     
>>> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
>>>     io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
>>>     
>>> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
>>>     java.lang.Thread.run(Thread.java:745)
>>> #3:
>>>     
>>> io.netty.buffer.AdvancedLeakAwareByteBuf.retain(AdvancedLeakAwareByteBuf.java:731)
>>>     
>>> io.netty.handler.codec.http.HttpObjectDecoder.decode(HttpObjectDecoder.java:302)
>>>     
>>> com.abc.handler.ReadTimeoutHttpResponseDecoder.decode(ReadTimeoutHttpResponseDecoder.java:72)
>>>     
>>> io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:369)
>>>     
>>> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:307)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:293)
>>>     
>>> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:840)
>>>     
>>> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
>>>     io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
>>>     
>>> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
>>>     java.lang.Thread.run(Thread.java:745)
>>> #2:
>>>     
>>> io.netty.buffer.AdvancedLeakAwareByteBuf.readSlice(AdvancedLeakAwareByteBuf.java:113)
>>>     
>>> io.netty.handler.codec.http.HttpObjectDecoder.decode(HttpObjectDecoder.java:302)
>>>     
>>> com.abc.handler.ReadTimeoutHttpResponseDecoder.decode(ReadTimeoutHttpResponseDecoder.java:72)
>>>     
>>> io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:369)
>>>     
>>> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:307)
>>>     
>>> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:293)
>>>     
>>> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:840)
>>>     
>>> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
>>>     io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
>>>     
>>> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
>>>     java.lang.Thread.run(Thread.java:745)
>>> #1:
>>>     
>>> io.netty.buffer.AdvancedLeakAwareByteBuf.writeBytes(AdvancedLeakAwareByteBuf.java:611)
>>>     
>>> io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:242)
>>>     
>>> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:119)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
>>>     io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
>>>     
>>> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
>>>     java.lang.Thread.run(Thread.java:745)
>>> Created at:
>>>     
>>> io.netty.buffer.UnpooledByteBufAllocator.newDirectBuffer(UnpooledByteBufAllocator.java:56)
>>>     
>>> io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:177)
>>>     
>>> io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:168)
>>>     
>>> io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:129)
>>>     
>>> io.netty.channel.AdaptiveRecvByteBufAllocator$HandleImpl.allocate(AdaptiveRecvByteBufAllocator.java:104)
>>>     
>>> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:117)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
>>>     
>>> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
>>>     io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
>>>     
>>> io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
>>>     java.lang.Thread.run(Thread.java:745)
>>> 
>>> =============================================================================
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "Netty discussions" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to [email protected].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/netty/CAOG5%2B9nD2%2BkyYDQdSGDz9-GHz%2BbERcN8%2Bg8k3bVsqmFODTB8vw%40mail.gmail.com.
>>> For more options, visit https://groups.google.com/d/optout.
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Netty discussions" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/netty/AB57566F-4C23-4755-90E1-B31058794F48%40googlemail.com.
>> For more options, visit https://groups.google.com/d/optout.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Netty discussions" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/netty/CAOG5%2B9%3DdEmg55D9x7GYpDBONobDo320ZUyW91bxzBnRhyYc9eQ%40mail.gmail.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/netty/7A7F7149-1B2D-4A4F-9512-198194A74361%40googlemail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to