Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-5576

Use MessageToByteEncoder to avoid ByteBuf leak w/ exceptions

    XMLWordPrintable

Details

    Description

      Encoder implementation allocates buffers but does not release them in case of exception before the encoded buffer is added to the response list. As a result, if encoding faces exceptions, it could leak byte buffers and show messages like this:

      [io.netty.util.ResourceLeakDetector] LEAK: ByteBuf.release() was not called before it's garbage-collected. 
      Enable advanced leak reporting to find out where the leak occurred. To enable advanced leak reporting, 
      specify the JVM option '-Dio.netty.leakDetectionLevel=advanced' or call ResourceLeakDetector.setLevel()
      
      LEAK: ByteBuf.release() was not called before it's garbage-collected.
      Recent access records: 0
      Created at:
      	io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:259)
      	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:155)
      	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:141)
      	io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:75)
      	org.infinispan.server.hotrod.HotRodEncoder.encode(HotRodEncoder.scala:29)
      	io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89)
      	io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:633)
      	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:691)
      	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:626)
      	io.netty.handler.timeout.IdleStateHandler.write(IdleStateHandler.java:266)
      	io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:633)
      	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:691)
      	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:681)
      	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:716)
      	io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:954)
      	io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:243)
      	org.infinispan.server.core.AbstractProtocolDecoder.writeResponse(AbstractProtocolDecoder.scala:220)
      	org.infinispan.server.hotrod.HotRodDecoder.customDecodeHeader(HotRodDecoder.scala:153)
      	org.infinispan.server.core.AbstractProtocolDecoder.org$infinispan$server$core$AbstractProtocolDecoder$$decodeHeader(AbstractProtocolDecoder.scala:137)
      	org.infinispan.server.core.AbstractProtocolDecoder$$anon$2.run(AbstractProtocolDecoder.scala:98)
      	org.infinispan.server.core.AbstractProtocolDecoder$$anon$2.run(AbstractProtocolDecoder.scala:95)
      	org.infinispan.security.Security.doAs(Security.java:143)
      	org.infinispan.server.core.AbstractProtocolDecoder.secureDecodeDispatch(AbstractProtocolDecoder.scala:95)
      	org.infinispan.server.core.AbstractProtocolDecoder.decode(AbstractProtocolDecoder.scala:59)
      	io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:370)
      	io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:168)
      	org.infinispan.server.core.AbstractProtocolDecoder.channelRead(AbstractProtocolDecoder.scala:459)
      	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
      	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
      	io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
      	io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
      	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:116)
      	java.lang.Thread.run(Thread.java:745)
      

      Also, encoder implementation does not log exceptions reported at encoding time, so exceptions like this can only be noticed via instrumentation.

      Attachments

        Issue Links

          Activity

            People

              gzamarre Galder ZamarreƱo
              gzamarre Galder ZamarreƱo
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: