[
https://issues.apache.org/jira/browse/IGNITE-26418?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mikhail Pochatkin reassigned IGNITE-26418:
------------------------------------------
Assignee: Mikhail Pochatkin
> Netty buffer leaks in CompletedFileUploadSubscriber
> ---------------------------------------------------
>
> Key: IGNITE-26418
> URL: https://issues.apache.org/jira/browse/IGNITE-26418
> Project: Ignite
> Issue Type: Bug
> Components: rest ai3
> Reporter: Pavel Tupitsyn
> Assignee: Mikhail Pochatkin
> Priority: Blocker
> Labels: ignite-3
> Fix For: 3.1
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> *CompletedFileUploadSubscriber* releases accumulated buffers only on
> successful completion. If there is an exception and *result* future is in
> failed state, we never release accumulated buffers.
> It might be better to save the buffers to temp files to avoid hogging Netty
> buffers and keeping the entire upload in memory.
> {code}
> [2025-09-11T11:52:39,799][ERROR][iect_n_3345-network-worker-1][ResourceLeakDetector]
> LEAK: ByteBuf.release() was not called before it's garbage-collected. See
> https://netty.io/wiki/reference-counted-objects.html for more information.
> 11:52:39 Recent access records:
> 11:52:39 #1:
> 11:52:39
> io.netty.handler.codec.http.multipart.AbstractMemoryHttpData.touch(AbstractMemoryHttpData.java:299)
> 11:52:39
> io.netty.handler.codec.http.multipart.MemoryFileUpload.touch(MemoryFileUpload.java:185)
> 11:52:39
> io.netty.handler.codec.http.multipart.MemoryFileUpload.touch(MemoryFileUpload.java:32)
> 11:52:39
> io.netty.handler.codec.http.multipart.AbstractMemoryHttpData.touch(AbstractMemoryHttpData.java:293)
> 11:52:39
> io.netty.handler.codec.http.multipart.MemoryFileUpload.touch(MemoryFileUpload.java:179)
> 11:52:39
> io.netty.handler.codec.http.multipart.MemoryFileUpload.touch(MemoryFileUpload.java:32)
> 11:52:39
> io.micronaut.http.server.netty.FormDataHttpContentProcessor.onData(FormDataHttpContentProcessor.java:162)
> 11:52:39
> io.micronaut.http.server.netty.AbstractHttpContentProcessor.doOnNext(AbstractHttpContentProcessor.java:79)
> 11:52:39
> io.micronaut.http.server.netty.AbstractHttpContentProcessor.doOnNext(AbstractHttpContentProcessor.java:36)
> 11:52:39
> io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onNext(CompletionAwareSubscriber.java:56)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.publishMessage(HandlerPublisher.java:393)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.flushBuffer(HandlerPublisher.java:470)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.publishMessageLater(HandlerPublisher.java:360)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.channelRead(HandlerPublisher.java:323)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:317)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:283)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:134)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
> 11:52:39
> io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:87)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.handler.codec.http.HttpContentDecoder.decode(HttpContentDecoder.java:170)
> 11:52:39
> io.netty.handler.codec.http.HttpContentDecoder.decode(HttpContentDecoder.java:48)
> 11:52:39
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:91)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:356)
> 11:52:39
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
> 11:52:39
> io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:120)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
> 11:52:39
> io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.handler.flow.FlowControlHandler.dequeue(FlowControlHandler.java:201)
> 11:52:39
> io.netty.handler.flow.FlowControlHandler.read(FlowControlHandler.java:138)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:725)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.requestDemand(HandlerPublisher.java:165)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler$2.requestDemand(HttpStreamsHandler.java:274)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.receivedDemand(HandlerPublisher.java:556)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.lambda$request$0(HandlerPublisher.java:494)
> 11:52:39
> io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148)
> 11:52:39
> io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:141)
> 11:52:39
> io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:535)
> 11:52:39
> io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:201)
> 11:52:39
> io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1193)
> 11:52:39
> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
> 11:52:39
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
> 11:52:39
> 11:52:39 java.base/java.lang.Thread.run(Thread.java:833)
> 11:52:39 Created at:
> 11:52:39 > Task :ignite-compute:integrationTest
> 11:52:39
> io.netty.buffer.AdaptiveByteBufAllocator.newDirectBuffer(AdaptiveByteBufAllocator.java:67)
> 11:52:39
> io.netty.buffer.UnsafeByteBufUtil.copy(UnsafeByteBufUtil.java:454)
> 11:52:39
> io.netty.buffer.UnpooledUnsafeDirectByteBuf.copy(UnpooledUnsafeDirectByteBuf.java:291)
> 11:52:39
> io.netty.buffer.AdaptivePoolingAllocator$AdaptiveByteBuf.copy(AdaptivePoolingAllocator.java:1641)
> 11:52:39 io.netty.buffer.WrappedByteBuf.copy(WrappedByteBuf.java:892)
> 11:52:39
> io.netty.buffer.AdvancedLeakAwareByteBuf.copy(AdvancedLeakAwareByteBuf.java:708)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.loadDataMultipartOptimized(HttpPostMultipartRequestDecoder.java:1252)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.getFileUpload(HttpPostMultipartRequestDecoder.java:955)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.decodeMultipart(HttpPostMultipartRequestDecoder.java:609)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.findMultipartDisposition(HttpPostMultipartRequestDecoder.java:834)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.decodeMultipart(HttpPostMultipartRequestDecoder.java:554)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.findMultipartDelimiter(HttpPostMultipartRequestDecoder.java:700)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.decodeMultipart(HttpPostMultipartRequestDecoder.java:541)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.parseBodyMultipart(HttpPostMultipartRequestDecoder.java:506)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.parseBody(HttpPostMultipartRequestDecoder.java:472)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.offer(HttpPostMultipartRequestDecoder.java:384)
> 11:52:39
> io.netty.handler.codec.http.multipart.HttpPostMultipartRequestDecoder.offer(HttpPostMultipartRequestDecoder.java:55)
> 11:52:39
> io.micronaut.http.server.netty.FormDataHttpContentProcessor.onData(FormDataHttpContentProcessor.java:158)
> 11:52:39
> io.micronaut.http.server.netty.AbstractHttpContentProcessor.doOnNext(AbstractHttpContentProcessor.java:79)
> 11:52:39
> io.micronaut.http.server.netty.AbstractHttpContentProcessor.doOnNext(AbstractHttpContentProcessor.java:36)
> 11:52:39
> io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onNext(CompletionAwareSubscriber.java:56)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.publishMessage(HandlerPublisher.java:393)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.flushBuffer(HandlerPublisher.java:470)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.publishMessageLater(HandlerPublisher.java:360)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.channelRead(HandlerPublisher.java:323)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:317)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:283)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:134)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
> 11:52:39
> io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:87)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.handler.codec.http.HttpContentDecoder.decode(HttpContentDecoder.java:170)
> 11:52:39
> io.netty.handler.codec.http.HttpContentDecoder.decode(HttpContentDecoder.java:48)
> 11:52:39
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:91)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:356)
> 11:52:39
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:107)
> 11:52:39
> io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:120)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
> 11:52:39
> io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:354)
> 11:52:39
> io.netty.handler.flow.FlowControlHandler.dequeue(FlowControlHandler.java:201)
> 11:52:39
> io.netty.handler.flow.FlowControlHandler.read(FlowControlHandler.java:138)
> 11:52:39
> io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:725)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher.requestDemand(HandlerPublisher.java:165)
> 11:52:39
> io.micronaut.http.netty.stream.HttpStreamsHandler$2.requestDemand(HttpStreamsHandler.java:274)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.receivedDemand(HandlerPublisher.java:556)
> 11:52:39
> io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.lambda$request$0(HandlerPublisher.java:494)
> 11:52:39
> io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:148)
> 11:52:39
> io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:141)
> 11:52:39
> io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:535)
> 11:52:39
> io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:201)
> 11:52:39
> io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1193)
> 11:52:39
> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
> 11:52:39
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
> 11:52:39 java.base/java.lang.Thread.run(Thread.java:833)
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)