armeria icon indicating copy to clipboard operation
armeria copied to clipboard

Fix leak due to unreleased buffer in HttpEncodedResponse::beforeComplete

Open ashwin1dd opened this issue 2 years ago • 0 comments

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

ashwin1dd avatar Dec 19 '23 21:12 ashwin1dd