From 5ea33bbb91a93f1406fcb5facb19f40662a90d46 Mon Sep 17 00:00:00 2001 From: HarshDevelops Date: Sun, 19 Jul 2026 11:16:32 +0530 Subject: [PATCH] AVRO-4268: BytesWritableConverter should respect logical length BytesWritable.getBytes() returns the backing array, which can be larger than the logical length reported by BytesWritable.getLength(). Wrap input.getBytes() with the actual length so the Avro bytes value reflects the caller's data, not unused backing-array capacity. Adds convertBytesWritableRespectsLogicalLength to cover the regression. Signed-off-by: Harsh Srivastava --- .../avro/hadoop/io/AvroDatumConverterFactory.java | 2 +- .../hadoop/io/TestAvroDatumConverterFactory.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lang/java/mapred/src/main/java/org/apache/avro/hadoop/io/AvroDatumConverterFactory.java b/lang/java/mapred/src/main/java/org/apache/avro/hadoop/io/AvroDatumConverterFactory.java index f2e4fcca3d7..a9984e08e54 100644 --- a/lang/java/mapred/src/main/java/org/apache/avro/hadoop/io/AvroDatumConverterFactory.java +++ b/lang/java/mapred/src/main/java/org/apache/avro/hadoop/io/AvroDatumConverterFactory.java @@ -199,7 +199,7 @@ public BytesWritableConverter() { /** {@inheritDoc} */ @Override public ByteBuffer convert(BytesWritable input) { - return ByteBuffer.wrap(input.getBytes()); + return ByteBuffer.wrap(input.getBytes(), 0, input.getLength()); } /** {@inheritDoc} */ diff --git a/lang/java/mapred/src/test/java/org/apache/avro/hadoop/io/TestAvroDatumConverterFactory.java b/lang/java/mapred/src/test/java/org/apache/avro/hadoop/io/TestAvroDatumConverterFactory.java index b0d2041c1a2..21a1bf361d7 100644 --- a/lang/java/mapred/src/test/java/org/apache/avro/hadoop/io/TestAvroDatumConverterFactory.java +++ b/lang/java/mapred/src/test/java/org/apache/avro/hadoop/io/TestAvroDatumConverterFactory.java @@ -89,6 +89,21 @@ void convertBytesWritable() { assertEquals(3, bytes.get(2)); } + @Test + void convertBytesWritableRespectsLogicalLength() { + AvroDatumConverter converter = mFactory.create(BytesWritable.class); + byte[] backing = new byte[] { 1, 2, 3, 4, 5 }; + BytesWritable writable = new BytesWritable(backing); + writable.setSize(3); + + ByteBuffer bytes = converter.convert(writable); + + assertEquals(3, bytes.remaining()); + assertEquals(1, bytes.get(0)); + assertEquals(2, bytes.get(1)); + assertEquals(3, bytes.get(2)); + } + @Test void convertByteWritable() { AvroDatumConverter converter = mFactory.create(ByteWritable.class);