Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

finagle/netty4-7: LEAK: ByteBuf.release() was not called before it's garbage-collected #1678

Closed
klingerf opened this issue Oct 19, 2017 · 3 comments · Fixed by #1711
Closed
Assignees
Milestone

Comments

@klingerf
Copy link
Member

I'm running the latest linkerd master (6148117) in Kubernetes 1.7.8, and have started seeing warnings in the linkerd logs:

ERROR 1019 21:54:39.902 UTC finagle/netty4-7: LEAK: ByteBuf.release() was not called before it's garbage-collected. See http:https://netty.io/wiki/reference-counted-objects.html for more information.

In my environment, I'm running the gob app, with a sidecar h2 router configuration that looks like this:

    routers:
    - protocol: h2
      experimental: true
      label: outgoing
      servers:
      - port: 5252
        ip: 0.0.0.0
      client:
        tls:
          commonName: linkerd
          trustCerts:
          - /io.buoyant/linkerd/certs/cacertificate.pem
      dtab: |
        /host/proto.GenSvc => /srv/gen2;
        /host/proto.WordSvc => /srv/word2;
      identifier:
        kind: io.l5d.header.path
      interpreter:
        kind: io.l5d.namerd.http
        experimental: true
        dst: /$/inet/namerd.test.svc.cluster.local/4180
        namespace: default

    - protocol: h2
      experimental: true
      label: incoming
      servers:
      - port: 6262
        ip: 0.0.0.0
        tls:
          certPath: /io.buoyant/linkerd/certs/linkerdcertificate.pem
          keyPath: /io.buoyant/linkerd/certs/linkerdkey.pk8
      dtab: /svc => /$/inet/127.1/8282

The leaks are being reported for requests from the web service to the gen service, which uses gRPC streaming. Here's the full leak report from the log:

ERROR 1019 21:54:39.902 UTC finagle/netty4-7: LEAK: ByteBuf.release() was not called before it's garbage-collected. See http:https://netty.io/wiki/reference-counted-objects.html for more information.
WARNING: 112 leak records were discarded because the leak record count is limited to 4. Use system property io.netty.leakDetection.maxRecords to increase the limit.
Recent access records: 4
#4:
	io.netty.buffer.AdvancedLeakAwareByteBuf.release(AdvancedLeakAwareByteBuf.java:936)
	io.netty.handler.codec.http2.DefaultHttp2DataFrame.release(DefaultHttp2DataFrame.java:134)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.$anonfun$write$1(Netty4H2Writer.scala:40)
	com.twitter.util.Future.$anonfun$ensure$1(Future.scala:1549)
	com.twitter.util.Future.$anonfun$ensure$1$adapted(Future.scala:1548)
	com.twitter.util.Promise$Monitored.apply(Promise.scala:205)
	com.twitter.util.Promise$Monitored.apply(Promise.scala:200)
	com.twitter.util.Promise$$anon$7.run(Promise.scala:532)
	com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
	com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
	com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
	com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
	com.twitter.util.Promise.runq(Promise.scala:522)
	com.twitter.util.Promise.updateIfEmpty(Promise.scala:880)
	com.twitter.util.Promise.setDone(Promise.scala:849)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:104)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:102)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:481)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.tryPromise(Http2CodecUtil.java:384)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:351)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:263)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:669)
	io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:257)
	io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:337)
	io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:448)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856)
	io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823)
	io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1304)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.ssl.SslHandler.forceFlush(SslHandler.java:1667)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:735)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.access$1500(AbstractChannelHandlerContext.java:38)
	io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1137)
	io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1078)
	io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
	java.lang.Thread.run(Thread.java:748)
#3:
	io.netty.buffer.AdvancedLeakAwareByteBuf.release(AdvancedLeakAwareByteBuf.java:936)
	io.netty.buffer.CompositeByteBuf$Component.freeIfNecessary(CompositeByteBuf.java:1672)
	io.netty.buffer.CompositeByteBuf.deallocate(CompositeByteBuf.java:1937)
	io.netty.buffer.AbstractReferenceCountedByteBuf.release0(AbstractReferenceCountedByteBuf.java:106)
	io.netty.buffer.AbstractReferenceCountedByteBuf.release(AbstractReferenceCountedByteBuf.java:89)
	io.netty.handler.ssl.SslHandler$SslHandlerCoalescingBufferQueue.composeFirst(SslHandler.java:1832)
	io.netty.channel.AbstractCoalescingBufferQueue.remove(AbstractCoalescingBufferQueue.java:154)
	io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:752)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:731)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802)
	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)
	io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1040)
	io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:296)
	com.twitter.finagle.netty4.transport.ChannelTransport.write(ChannelTransport.scala:99)
	com.twitter.finagle.transport.Transport$$anon$3.write(Transport.scala:343)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:92)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:38)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:34)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:30)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:29)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeFrame$1(Netty4StreamTransport.scala:589)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeStream$2(Netty4StreamTransport.scala:564)
	com.twitter.util.Future.$anonfun$flatMap$1(Future.scala:1740)
	com.twitter.util.Promise$Transformer.liftedTree1$1(Promise.scala:228)
	com.twitter.util.Promise$Transformer.k(Promise.scala:228)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:239)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:220)
	com.twitter.util.Promise$$anon$7.run(Promise.scala:532)
	com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
	com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
	com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
	com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
	com.twitter.util.Promise.runq(Promise.scala:522)
	com.twitter.util.Promise.updateIfEmpty(Promise.scala:880)
	com.twitter.util.Promise.setDone(Promise.scala:849)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:104)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:102)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:481)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.tryPromise(Http2CodecUtil.java:384)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:351)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:263)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:669)
	io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:257)
	io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:337)
	io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:448)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856)
	io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823)
	io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1304)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.ssl.SslHandler.forceFlush(SslHandler.java:1667)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:735)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.access$1500(AbstractChannelHandlerContext.java:38)
	io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1137)
	io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1078)
	io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
	java.lang.Thread.run(Thread.java:748)
#2:
	io.netty.buffer.AdvancedLeakAwareByteBuf.getBytes(AdvancedLeakAwareByteBuf.java:234)
	io.netty.buffer.CompositeByteBuf.getBytes(CompositeByteBuf.java:912)
	io.netty.buffer.CompositeByteBuf.getBytes(CompositeByteBuf.java:44)
	io.netty.buffer.UnsafeByteBufUtil.setBytes(UnsafeByteBufUtil.java:528)
	io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:260)
	io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1078)
	io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1070)
	io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1060)
	io.netty.handler.ssl.SslHandler$SslHandlerCoalescingBufferQueue.composeFirst(SslHandler.java:1831)
	io.netty.channel.AbstractCoalescingBufferQueue.remove(AbstractCoalescingBufferQueue.java:154)
	io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:752)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:731)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802)
	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)
	io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1040)
	io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:296)
	com.twitter.finagle.netty4.transport.ChannelTransport.write(ChannelTransport.scala:99)
	com.twitter.finagle.transport.Transport$$anon$3.write(Transport.scala:343)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:92)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:38)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:34)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:30)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:29)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeFrame$1(Netty4StreamTransport.scala:589)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeStream$2(Netty4StreamTransport.scala:564)
	com.twitter.util.Future.$anonfun$flatMap$1(Future.scala:1740)
	com.twitter.util.Promise$Transformer.liftedTree1$1(Promise.scala:228)
	com.twitter.util.Promise$Transformer.k(Promise.scala:228)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:239)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:220)
	com.twitter.util.Promise$$anon$7.run(Promise.scala:532)
	com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
	com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
	com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
	com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
	com.twitter.util.Promise.runq(Promise.scala:522)
	com.twitter.util.Promise.updateIfEmpty(Promise.scala:880)
	com.twitter.util.Promise.setDone(Promise.scala:849)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:104)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:102)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:481)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.tryPromise(Http2CodecUtil.java:384)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:351)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:263)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:669)
	io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:257)
	io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:337)
	io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:448)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856)
	io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823)
	io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1304)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.ssl.SslHandler.forceFlush(SslHandler.java:1667)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:735)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.access$1500(AbstractChannelHandlerContext.java:38)
	io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1137)
	io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1078)
	io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
	java.lang.Thread.run(Thread.java:748)
#1:
	io.netty.buffer.AdvancedLeakAwareByteBuf.nioBuffer(AdvancedLeakAwareByteBuf.java:714)
	io.netty.buffer.CompositeByteBuf.nioBuffers(CompositeByteBuf.java:1495)
	io.netty.buffer.CompositeByteBuf.nioBuffers(CompositeByteBuf.java:1918)
	io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:933)
	io.netty.handler.ssl.SslHandler.wrap(SslHandler.java:762)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:731)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:802)
	io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:814)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794)
	io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:831)
	io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1040)
	io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:296)
	com.twitter.finagle.netty4.transport.ChannelTransport.write(ChannelTransport.scala:99)
	com.twitter.finagle.transport.Transport$$anon$3.write(Transport.scala:343)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:92)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:38)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:34)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write(Netty4H2Writer.scala:30)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer.write$(Netty4H2Writer.scala:29)
	com.twitter.finagle.buoyant.h2.netty4.Netty4H2Writer$$anon$1.write(Netty4H2Writer.scala:89)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeFrame$1(Netty4StreamTransport.scala:589)
	com.twitter.finagle.buoyant.h2.netty4.Netty4StreamTransport.$anonfun$writeStream$2(Netty4StreamTransport.scala:564)
	com.twitter.util.Future.$anonfun$flatMap$1(Future.scala:1740)
	com.twitter.util.Promise$Transformer.liftedTree1$1(Promise.scala:228)
	com.twitter.util.Promise$Transformer.k(Promise.scala:228)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:239)
	com.twitter.util.Promise$Transformer.apply(Promise.scala:220)
	com.twitter.util.Promise$$anon$7.run(Promise.scala:532)
	com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
	com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
	com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
	com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
	com.twitter.util.Promise.runq(Promise.scala:522)
	com.twitter.util.Promise.updateIfEmpty(Promise.scala:880)
	com.twitter.util.Promise.setDone(Promise.scala:849)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:104)
	com.twitter.finagle.netty4.transport.ChannelTransport$$anon$2.operationComplete(ChannelTransport.scala:102)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:481)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:82)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.tryPromise(Http2CodecUtil.java:384)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:351)
	io.netty.handler.codec.http2.Http2CodecUtil$SimpleChannelPromiseAggregator.trySuccess(Http2CodecUtil.java:263)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:52)
	io.netty.channel.DelegatingChannelPromiseNotifier.operationComplete(DelegatingChannelPromiseNotifier.java:31)
	io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
	io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
	io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
	io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
	io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
	io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
	io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:669)
	io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:257)
	io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:337)
	io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:448)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:856)
	io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:362)
	io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:823)
	io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1304)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.ssl.SslHandler.forceFlush(SslHandler.java:1667)
	io.netty.handler.ssl.SslHandler.wrapAndFlush(SslHandler.java:735)
	io.netty.handler.ssl.SslHandler.flush(SslHandler.java:712)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.handler.codec.http2.Http2ConnectionHandler.flush(Http2ConnectionHandler.java:172)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:749)
	io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:117)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:776)
	io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:768)
	io.netty.channel.AbstractChannelHandlerContext.access$1500(AbstractChannelHandlerContext.java:38)
	io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1137)
	io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1078)
	io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
	io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
	java.lang.Thread.run(Thread.java:748)
Created at:
	io.netty.util.ResourceLeakDetector.track(ResourceLeakDetector.java:237)
	io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:331)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:181)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:172)
	io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:109)
	io.netty.handler.codec.ByteToMessageDecoder.expandCumulation(ByteToMessageDecoder.java:516)
	io.netty.handler.codec.ByteToMessageDecoder$1.cumulate(ByteToMessageDecoder.java:88)
	io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	com.twitter.finagle.buoyant.h2.netty4.UnpoolHandler$.channelRead(UnpoolHandler.scala:42)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
	com.twitter.finagle.netty4.channel.ChannelRequestStatsHandler.channelRead(ChannelRequestStatsHandler.scala:41)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
	com.twitter.finagle.netty4.channel.ChannelStatsHandler.channelRead(ChannelStatsHandler.scala:106)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
	io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1342)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
	io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
	io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:934)
	io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134)
	io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
	io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
	io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
	io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
	io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
	java.lang.Thread.run(Thread.java:748)
@siggy
Copy link
Member

siggy commented Nov 3, 2017

Quick update for folks watching this issue. We have reproduced a leak and are actively working on a fix. To confirm the leak you are seeing is the same one we have identified, have a look at your open_streams metrics. If they grow over time, that is the leak.

@wmorgan
Copy link
Member

wmorgan commented Nov 9, 2017

@zackangelo does your open_streams metric grow over time?

@siggy
Copy link
Member

siggy commented Nov 13, 2017

Quick update: we're digging into this issue this week, stay tuned.

siggy added a commit that referenced this issue Nov 21, 2017
Netty was reporting "LEAK: ByteBuf.release() was not called", direct
memory was growing unbounded.

Remove unnecessary call to retain in h2 code.

Fixes #1678
siggy added a commit that referenced this issue Nov 28, 2017
Netty was reporting "LEAK: ByteBuf.release() was not called", direct
memory was growing unbounded.

Remove unnecessary call to retain in h2 code.

Fixes #1678
@hawkw hawkw added this to the 1.3.3 milestone Nov 28, 2017
hawkw added a commit that referenced this issue Dec 14, 2017
The Finagle `ByteBufAsBuf` converter wraps a Netty 4 `ByteBuf`, but does not support reference counting (see [this comment](https://github.com/twitter/finagle/blob/82d00660373582d6bfe56df8155b52528df36691/finagle-netty4/src/main/scala/com/twitter/finagle/netty4/ByteBufAsBuf.scala#L58-L61)). Therefore, when releasing a data frame whose content `ByteBuf` we `retain()` before wrapping it as a `Buf`, we must `release()` the underlying `ByteBuf`. 

This fixes the memory leak observed in #1678 without removing the call to `retain()` which was removed in #1711, which introduced a data corruption issue (#1728). If we `release()` the underlying `ByteBuf` after releasing the data frame, we can once again `retain()` it before converting to `Buf` without leaking, thus avoiding the data corruption caused by removing the `retain()`.

Thanks to @vadimi for helping with this fix!

Fixes #1728.
Tim-Brooks pushed a commit to Tim-Brooks/linkerd that referenced this issue Dec 20, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants