HADOOP-18355. Update previous index properly while validating overlapping ranges. (#4647)
part of HADOOP-18103.
Contributed By: Mukund Thakur
diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/VectoredReadUtils.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/VectoredReadUtils.java
index 64107f1a1..9e1551e 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/VectoredReadUtils.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/VectoredReadUtils.java
@@ -210,6 +210,7 @@
if (sortedRanges[i].getOffset() < prev.getOffset() + prev.getLength()) {
throw new UnsupportedOperationException("Overlapping ranges are not supported");
}
+ prev = sortedRanges[i];
}
return Arrays.asList(sortedRanges);
}
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestVectoredReadUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestVectoredReadUtils.java
index 5d08b02..f473036 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestVectoredReadUtils.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestVectoredReadUtils.java
@@ -35,6 +35,8 @@
import org.apache.hadoop.test.HadoopTestBase;
import static org.apache.hadoop.fs.VectoredReadUtils.sortRanges;
+import static org.apache.hadoop.fs.VectoredReadUtils.validateNonOverlappingAndReturnSortedRanges;
+import static org.apache.hadoop.test.LambdaTestUtils.intercept;
import static org.apache.hadoop.test.MoreAsserts.assertFutureCompletedSuccessfully;
import static org.apache.hadoop.test.MoreAsserts.assertFutureFailedExceptionally;
@@ -232,6 +234,36 @@
}
@Test
+ public void testValidateOverlappingRanges() throws Exception {
+ List<FileRange> input = Arrays.asList(
+ FileRange.createFileRange(100, 100),
+ FileRange.createFileRange(200, 100),
+ FileRange.createFileRange(250, 100)
+ );
+
+ intercept(UnsupportedOperationException.class,
+ () -> validateNonOverlappingAndReturnSortedRanges(input));
+
+ List<FileRange> input1 = Arrays.asList(
+ FileRange.createFileRange(100, 100),
+ FileRange.createFileRange(500, 100),
+ FileRange.createFileRange(1000, 100),
+ FileRange.createFileRange(1000, 100)
+ );
+
+ intercept(UnsupportedOperationException.class,
+ () -> validateNonOverlappingAndReturnSortedRanges(input1));
+
+ List<FileRange> input2 = Arrays.asList(
+ FileRange.createFileRange(100, 100),
+ FileRange.createFileRange(200, 100),
+ FileRange.createFileRange(300, 100)
+ );
+ // consecutive ranges should pass.
+ validateNonOverlappingAndReturnSortedRanges(input2);
+ }
+
+ @Test
public void testMaxSizeZeroDisablesMering() throws Exception {
List<FileRange> randomRanges = Arrays.asList(
FileRange.createFileRange(3000, 110),