From a64c4e6f57ac5cf70feb225d9823737f4558b613 Mon Sep 17 00:00:00 2001 From: Shin <128954611+shin4141@users.noreply.github.com> Date: Thu, 1 Oct 2026 09:39:29 +0900 Subject: [PATCH] fix(codec-java): return pooled buffer after encoding fails --- .../v2/core/code/AbstractEdgeEncoder.java | 14 ++++--- .../v2/core/code/AbstractEdgeEncoderTest.java | 40 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 codec-java/src/test/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoderTest.java diff --git a/codec-java/src/main/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoder.java b/codec-java/src/main/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoder.java index a077520cb..9adb061a3 100644 --- a/codec-java/src/main/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoder.java +++ b/codec-java/src/main/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoder.java @@ -404,11 +404,15 @@ public String useAsHexString(Consumer block) { public byte[] useAsByteArray(Consumer block) { EdgeBuffer edgeBuffer = borrow(); - edgeBuffer.reset(); - block.accept(edgeBuffer); - byte[] byteArray = edgeBuffer.buffer.toByteArray(); - release(edgeBuffer); - return byteArray; + try { + edgeBuffer.reset(); + block.accept(edgeBuffer); + return edgeBuffer.buffer.toByteArray(); + } finally { + if (edgeBuffer != null) { + release(edgeBuffer); + } + } } // --- private diff --git a/codec-java/src/test/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoderTest.java b/codec-java/src/test/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoderTest.java new file mode 100644 index 000000000..5cbc1d863 --- /dev/null +++ b/codec-java/src/test/java/com/kakao/actionbase/v2/core/code/AbstractEdgeEncoderTest.java @@ -0,0 +1,40 @@ +package com.kakao.actionbase.v2.core.code; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +class AbstractEdgeEncoderTest { + + @Test + void shouldReturnBorrowedBufferAfterEncodingFails() { + EdgeEncoderFactory factory = new EdgeEncoderFactory(1); + BytesKeyValueEdgeEncoder encoder = factory.getBytesKeyValueEncoder(); + EdgeBuffer borrowed = factory.pool.peek(); + + IllegalArgumentException failure = + assertThrows( + IllegalArgumentException.class, + () -> + encoder.useAsByteArray( + buffer -> { + buffer.encodeInt8((byte) 7); + buffer.encodeAny(new Object()); + })); + + assertEquals("Unexpected data of type : java.lang.Object", failure.getMessage()); + assertEquals(1, encoder.getPoolSize()); + assertSame(borrowed, factory.pool.peek()); + + byte[] encoded = encoder.useAsByteArray(buffer -> buffer.encodeInt8((byte) 1)); + byte[] expected = + new EdgeEncoderFactory() + .getBytesKeyValueEncoder() + .useAsByteArray(buffer -> buffer.encodeInt8((byte) 1)); + assertArrayEquals(expected, encoded); + assertSame(borrowed, factory.pool.peek()); + } +}