armeria
armeria copied to clipboard
Fix leak due to unreleased buffer in HttpEncodedResponse::beforeComplete
Motivation:
As per the stack trace below, the buffer which was allocated in HttpEncodedResponse.java:52 was never released.
The if branch in beforeComplete has missed releasing the buffer.
Our temporary workaround has been to create custom HttpEncodedResponse classes in our codebase and introducing the fix, because the original classes are final and non-extensible
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:
Created at:
io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:403)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:188)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:174)
io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:108)
com.linecorp.armeria.server.encoding.HttpEncodedResponse.filter(HttpEncodedResponse.java:112)
com.linecorp.armeria.server.encoding.HttpEncodedResponse.filter(HttpEncodedResponse.java:52)
com.linecorp.armeria.common.stream.FilteredStreamMessage.lambda$collect$0(FilteredStreamMessage.java:167)
java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
Modifications:
- Release buffer in
HttpEncodedResponse::beforeComplete
Result:
- Fixes leak due to unreleased buffer