Skip to content

Resume related Netty ByteBuf leak #779

@piotr-signalfx

Description

@piotr-signalfx

We observe the following leak reported by Netty from time to time:

LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records: 
#1:
	io.netty.buffer.AdvancedLeakAwareByteBuf.getShort(AdvancedLeakAwareByteBuf.java:166)
	io.rsocket.buffer.AbstractTupleByteBuf._getShort(AbstractTupleByteBuf.java:85)
	io.netty.buffer.AbstractByteBuf.readShort(AbstractByteBuf.java:751)
	io.rsocket.frame.FrameHeaderFlyweight.nativeFrameType(FrameHeaderFlyweight.java:89)
	io.rsocket.resume.ResumableDuplexConnection.isResumableFrame(ResumableDuplexConnection.java:366)
	io.rsocket.resume.ResumableDuplexConnection.sendFrame(ResumableDuplexConnection.java:221)
	io.rsocket.resume.ResumableDuplexConnection.dispatch(ResumableDuplexConnection.java:241)
	io.rsocket.resume.UpstreamFramesSubscriber.processFrame(UpstreamFramesSubscriber.java:156)
	io.rsocket.resume.UpstreamFramesSubscriber.onNext(UpstreamFramesSubscriber.java:73)
	io.rsocket.resume.UpstreamFramesSubscriber.onNext(UpstreamFramesSubscriber.java:32)
	reactor.core.publisher.StrictSubscriber.onNext(StrictSubscriber.java:89)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:695)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:571)
	reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:971)
	io.rsocket.internal.UnboundedProcessor.drainFused(UnboundedProcessor.java:144)
	io.rsocket.internal.UnboundedProcessor.drain(UnboundedProcessor.java:177)
	io.rsocket.internal.UnboundedProcessor.onNext(UnboundedProcessor.java:255)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:461)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
#2:
	io.netty.buffer.AdvancedLeakAwareByteBuf.writeByte(AdvancedLeakAwareByteBuf.java:544)
	io.rsocket.frame.DataAndMetadataFlyweight.encodeLength(DataAndMetadataFlyweight.java:21)
	io.rsocket.frame.DataAndMetadataFlyweight.encode(DataAndMetadataFlyweight.java:47)
	io.rsocket.frame.RequestFlyweight.encode(RequestFlyweight.java:59)
	io.rsocket.frame.PayloadFrameFlyweight.encodeNext(PayloadFrameFlyweight.java:56)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:453)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
#3:
	io.netty.buffer.AdvancedLeakAwareByteBuf.writeByte(AdvancedLeakAwareByteBuf.java:544)
	io.rsocket.frame.DataAndMetadataFlyweight.encodeLength(DataAndMetadataFlyweight.java:19)
	io.rsocket.frame.DataAndMetadataFlyweight.encode(DataAndMetadataFlyweight.java:47)
	io.rsocket.frame.RequestFlyweight.encode(RequestFlyweight.java:59)
	io.rsocket.frame.PayloadFrameFlyweight.encodeNext(PayloadFrameFlyweight.java:56)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:453)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
#4:
	io.netty.buffer.AdvancedLeakAwareByteBuf.writeShort(AdvancedLeakAwareByteBuf.java:550)
	io.rsocket.frame.FrameHeaderFlyweight.encode(FrameHeaderFlyweight.java:56)
	io.rsocket.frame.RequestFlyweight.encode(RequestFlyweight.java:50)
	io.rsocket.frame.PayloadFrameFlyweight.encodeNext(PayloadFrameFlyweight.java:56)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:453)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
#5:
	io.netty.buffer.AdvancedLeakAwareByteBuf.writeInt(AdvancedLeakAwareByteBuf.java:562)
	io.rsocket.frame.FrameHeaderFlyweight.encode(FrameHeaderFlyweight.java:56)
	io.rsocket.frame.RequestFlyweight.encode(RequestFlyweight.java:50)
	io.rsocket.frame.PayloadFrameFlyweight.encodeNext(PayloadFrameFlyweight.java:56)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:453)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
Created at:
	io.netty.buffer.PooledByteBufAllocator.newHeapBuffer(PooledByteBufAllocator.java:332)
	io.netty.buffer.AbstractByteBufAllocator.heapBuffer(AbstractByteBufAllocator.java:168)
	io.netty.buffer.AbstractByteBufAllocator.heapBuffer(AbstractByteBufAllocator.java:154)
	io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:109)
	io.rsocket.frame.FrameHeaderFlyweight.encode(FrameHeaderFlyweight.java:56)
	io.rsocket.frame.RequestFlyweight.encode(RequestFlyweight.java:50)
	io.rsocket.frame.PayloadFrameFlyweight.encodeNext(PayloadFrameFlyweight.java:56)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:453)
	io.rsocket.RSocketResponder$3.hookOnNext(RSocketResponder.java:447)
	reactor.core.publisher.BaseSubscriber.onNext(BaseSubscriber.java:158)
	io.rsocket.internal.RateLimitableRequestPublisher$InnerOperator.onNext(RateLimitableRequestPublisher.java:173)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:480)
	reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:415)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:793)
	reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:718)
	reactor.core.publisher.FluxCreate$SerializedSink.next(FluxCreate.java:153)
	xxx.xxxx.lambda$listXXX$1(XXXXService.java:74)
	java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
	java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:834)
: 1 leak records were discarded because the leak record count is targeted to 4. Use system property io.netty.leakDetection.targetRecords to increase the limit.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions