From ab2fa91e5115321eff5082d19a4b30bee3c0b02a Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Thu, 13 Jun 2024 05:45:56 +0100 Subject: [PATCH] PARQUET-2498: Vector IO to handle empty range list (#1374) Empty range lists currently trigger IllegalArgumentException, however some (integration test) codepaths attempt to do this. Downgrading the empty list case to a no-op resolves this. Contributed by Steve Loughran Change-Id: I07ed7e8f0628e170441a2d0679e822d23cfb1440 --- .../hadoop/util/wrapped/io/VectorIoBridge.java | 7 ++++++- .../hadoop/util/wrapped/io/TestVectorIoBridge.java | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/util/wrapped/io/VectorIoBridge.java b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/util/wrapped/io/VectorIoBridge.java index 3523a12ab0..7720f7fe94 100644 --- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/util/wrapped/io/VectorIoBridge.java +++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/util/wrapped/io/VectorIoBridge.java @@ -362,7 +362,12 @@ private static ParquetFileRange validateRangeRequest(ParquetFileRange range) { private static List validateAndSortRanges(final List input) { requireNonNull(input, "Null input list"); - checkArgument(!input.isEmpty(), "Empty input list"); + if (input.isEmpty()) { + // this may seem a pathological case, but it + // has surfaced during testing. + LOG.debug("Empty input list"); + return input; + } final List sortedRanges; if (input.size() == 1) { diff --git a/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/util/wrapped/io/TestVectorIoBridge.java b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/util/wrapped/io/TestVectorIoBridge.java index ad97851ba1..6d7b92fc7a 100644 --- a/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/util/wrapped/io/TestVectorIoBridge.java +++ b/parquet-hadoop/src/test/java/org/apache/parquet/hadoop/util/wrapped/io/TestVectorIoBridge.java @@ -305,6 +305,17 @@ public void testNullRangeList() throws Exception { verifyExceptionalVectoredRead(null, NullPointerException.class); } + /** + * An empty range list is permitted. + */ + @Test + public void testEmptyRangeList() throws Exception { + List fileRanges = new ArrayList<>(); + try (FSDataInputStream in = openTestFile()) { + readVectored(in, fileRanges); + } + } + @Test public void testSomeRandomNonOverlappingRanges() throws Exception { List fileRanges = ranges(