From 187dbe2beadf52fd1d1307a20819a864f0400479 Mon Sep 17 00:00:00 2001 From: Dongjoon Hyun Date: Sun, 4 Jan 2026 08:12:30 +0900 Subject: [PATCH] ORC-2049: Move `MAX_ARRAY_SIZE` to `RecordReaderUtils` from `IOUtils` --- .../src/java/org/apache/orc/impl/IOUtils.java | 5 ----- .../apache/orc/impl/RecordReaderUtils.java | 13 ++++++++---- .../orc/impl/TestRecordReaderUtils.java | 21 ++++++++++--------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/java/core/src/java/org/apache/orc/impl/IOUtils.java b/java/core/src/java/org/apache/orc/impl/IOUtils.java index d28ea6c663..d580294154 100644 --- a/java/core/src/java/org/apache/orc/impl/IOUtils.java +++ b/java/core/src/java/org/apache/orc/impl/IOUtils.java @@ -30,11 +30,6 @@ public final class IOUtils { public static final int DEFAULT_BUFFER_SIZE = 8192; - /** - * The maximum size of array to allocate, value being the same as {@link java.util.Hashtable} - */ - public static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - /** * Returns a new byte array of size {@link #DEFAULT_BUFFER_SIZE}. * diff --git a/java/core/src/java/org/apache/orc/impl/RecordReaderUtils.java b/java/core/src/java/org/apache/orc/impl/RecordReaderUtils.java index e88cccc33a..ec5a2494bb 100644 --- a/java/core/src/java/org/apache/orc/impl/RecordReaderUtils.java +++ b/java/core/src/java/org/apache/orc/impl/RecordReaderUtils.java @@ -47,6 +47,11 @@ * Stateless methods shared between RecordReaderImpl and EncodedReaderImpl. */ public class RecordReaderUtils { + /** + * The maximum size of array to allocate, value being the same as {@link java.util.Hashtable} + */ + public static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + private static final HadoopShims SHIMS = HadoopShimsFactory.get(); private static final boolean supportVectoredIO = SHIMS.supportVectoredIO(VersionInfo.getVersion()); @@ -836,12 +841,12 @@ static ChunkReader create(BufferChunk from, BufferChunk to) { current = (BufferChunk) current.next; } reqBytes += currentEnd - currentStart; - if (reqBytes > IOUtils.MAX_ARRAY_SIZE) { - throw new IllegalArgumentException("invalid reqBytes value " + reqBytes + ",out of bounds " + IOUtils.MAX_ARRAY_SIZE); + if (reqBytes > MAX_ARRAY_SIZE) { + throw new IllegalArgumentException("invalid reqBytes value " + reqBytes + ",out of bounds " + MAX_ARRAY_SIZE); } long readBytes = end - start; - if (readBytes > IOUtils.MAX_ARRAY_SIZE) { - throw new IllegalArgumentException("invalid readBytes value " + readBytes + ",out of bounds " + IOUtils.MAX_ARRAY_SIZE); + if (readBytes > MAX_ARRAY_SIZE) { + throw new IllegalArgumentException("invalid readBytes value " + readBytes + ",out of bounds " + MAX_ARRAY_SIZE); } return new ChunkReader(from, to, (int) readBytes, (int) reqBytes); } diff --git a/java/core/src/test/org/apache/orc/impl/TestRecordReaderUtils.java b/java/core/src/test/org/apache/orc/impl/TestRecordReaderUtils.java index 54a961550d..28e161bd31 100644 --- a/java/core/src/test/org/apache/orc/impl/TestRecordReaderUtils.java +++ b/java/core/src/test/org/apache/orc/impl/TestRecordReaderUtils.java @@ -209,30 +209,31 @@ public void testChunkReaderCreateOffsetExceedsMaxInt() { @Test public void testChunkReaderCreateReqBytesAndReadBytesValidation() { + int MAX_ARRAY_SIZE = RecordReaderUtils.MAX_ARRAY_SIZE; BufferChunkList rangeList = new TestOrcLargeStripe.RangeBuilder() - .range(0, IOUtils.MAX_ARRAY_SIZE) - .range(1L + IOUtils.MAX_ARRAY_SIZE, IOUtils.MAX_ARRAY_SIZE + 1) - .range(2L * IOUtils.MAX_ARRAY_SIZE, IOUtils.MAX_ARRAY_SIZE - 4) - .range(3L * IOUtils.MAX_ARRAY_SIZE, 2) + .range(0, MAX_ARRAY_SIZE) + .range(1L + MAX_ARRAY_SIZE, MAX_ARRAY_SIZE + 1) + .range(2L * MAX_ARRAY_SIZE, MAX_ARRAY_SIZE - 4) + .range(3L * MAX_ARRAY_SIZE, 2) .build(); // reqBytes,readBytes boundary value RecordReaderUtils.ChunkReader chunkReader = RecordReaderUtils.ChunkReader.create(rangeList.get(0), 0); - assertEquals(chunkReader.getReadBytes(), IOUtils.MAX_ARRAY_SIZE); - assertEquals(chunkReader.getReqBytes(), IOUtils.MAX_ARRAY_SIZE); + assertEquals(chunkReader.getReadBytes(), MAX_ARRAY_SIZE); + assertEquals(chunkReader.getReqBytes(), MAX_ARRAY_SIZE); - // reqBytes > IOUtils.MAX_ARRAY_SIZE validation + // reqBytes > MAX_ARRAY_SIZE validation assertThrowsExactly(IllegalArgumentException.class, () -> RecordReaderUtils.ChunkReader.create(rangeList.get(1), 0), () -> String.format("invalid reqBytes value %d,out of bounds %d", - rangeList.get(1).getLength(), IOUtils.MAX_ARRAY_SIZE) + rangeList.get(1).getLength(), MAX_ARRAY_SIZE) ); - // readBytes > IOUtils.MAX_ARRAY_SIZE validation + // readBytes > MAX_ARRAY_SIZE validation assertThrowsExactly(IllegalArgumentException.class, () -> RecordReaderUtils.ChunkReader.create(rangeList.get(2), 100), () -> String.format("invalid readBytes value %d,out of bounds %d", - rangeList.get(3).getEnd() - rangeList.get(2).getOffset(), IOUtils.MAX_ARRAY_SIZE) + rangeList.get(3).getEnd() - rangeList.get(2).getOffset(), MAX_ARRAY_SIZE) ); }