|
@@ -16,7 +16,7 @@
|
|
* limitations under the License.
|
|
* limitations under the License.
|
|
*/
|
|
*/
|
|
|
|
|
|
-package org.apache.hadoop.fs.impl;
|
|
|
|
|
|
+package org.apache.hadoop.fs;
|
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteBuffer;
|
|
@@ -31,12 +31,10 @@ import org.junit.Test;
|
|
import org.mockito.ArgumentMatchers;
|
|
import org.mockito.ArgumentMatchers;
|
|
import org.mockito.Mockito;
|
|
import org.mockito.Mockito;
|
|
|
|
|
|
-import org.apache.hadoop.fs.ByteBufferPositionedReadable;
|
|
|
|
-import org.apache.hadoop.fs.FileRange;
|
|
|
|
-import org.apache.hadoop.fs.FileRangeImpl;
|
|
|
|
-import org.apache.hadoop.fs.PositionedReadable;
|
|
|
|
|
|
+import org.apache.hadoop.fs.impl.CombinedFileRange;
|
|
import org.apache.hadoop.test.HadoopTestBase;
|
|
import org.apache.hadoop.test.HadoopTestBase;
|
|
|
|
|
|
|
|
+import static org.apache.hadoop.fs.VectoredReadUtils.sortRanges;
|
|
import static org.apache.hadoop.test.MoreAsserts.assertFutureCompletedSuccessfully;
|
|
import static org.apache.hadoop.test.MoreAsserts.assertFutureCompletedSuccessfully;
|
|
import static org.apache.hadoop.test.MoreAsserts.assertFutureFailedExceptionally;
|
|
import static org.apache.hadoop.test.MoreAsserts.assertFutureFailedExceptionally;
|
|
|
|
|
|
@@ -56,7 +54,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
}
|
|
}
|
|
// ensure we don't make unnecessary slices
|
|
// ensure we don't make unnecessary slices
|
|
ByteBuffer slice = VectoredReadUtils.sliceTo(buffer, 100,
|
|
ByteBuffer slice = VectoredReadUtils.sliceTo(buffer, 100,
|
|
- new FileRangeImpl(100, size));
|
|
|
|
|
|
+ FileRange.createFileRange(100, size));
|
|
Assertions.assertThat(buffer)
|
|
Assertions.assertThat(buffer)
|
|
.describedAs("Slicing on the same offset shouldn't " +
|
|
.describedAs("Slicing on the same offset shouldn't " +
|
|
"create a new buffer")
|
|
"create a new buffer")
|
|
@@ -67,7 +65,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
final int sliceStart = 1024;
|
|
final int sliceStart = 1024;
|
|
final int sliceLength = 16 * 1024;
|
|
final int sliceLength = 16 * 1024;
|
|
slice = VectoredReadUtils.sliceTo(buffer, offset,
|
|
slice = VectoredReadUtils.sliceTo(buffer, offset,
|
|
- new FileRangeImpl(offset + sliceStart, sliceLength));
|
|
|
|
|
|
+ FileRange.createFileRange(offset + sliceStart, sliceLength));
|
|
// make sure they aren't the same, but use the same backing data
|
|
// make sure they aren't the same, but use the same backing data
|
|
Assertions.assertThat(buffer)
|
|
Assertions.assertThat(buffer)
|
|
.describedAs("Slicing on new offset should " +
|
|
.describedAs("Slicing on new offset should " +
|
|
@@ -96,12 +94,12 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
|
|
|
|
@Test
|
|
@Test
|
|
public void testMerge() {
|
|
public void testMerge() {
|
|
- FileRange base = new FileRangeImpl(2000, 1000);
|
|
|
|
|
|
+ FileRange base = FileRange.createFileRange(2000, 1000);
|
|
CombinedFileRange mergeBase = new CombinedFileRange(2000, 3000, base);
|
|
CombinedFileRange mergeBase = new CombinedFileRange(2000, 3000, base);
|
|
|
|
|
|
// test when the gap between is too big
|
|
// test when the gap between is too big
|
|
assertFalse("Large gap ranges shouldn't get merged", mergeBase.merge(5000, 6000,
|
|
assertFalse("Large gap ranges shouldn't get merged", mergeBase.merge(5000, 6000,
|
|
- new FileRangeImpl(5000, 1000), 2000, 4000));
|
|
|
|
|
|
+ FileRange.createFileRange(5000, 1000), 2000, 4000));
|
|
assertEquals("Number of ranges in merged range shouldn't increase",
|
|
assertEquals("Number of ranges in merged range shouldn't increase",
|
|
1, mergeBase.getUnderlying().size());
|
|
1, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
@@ -109,7 +107,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
|
|
|
|
// test when the total size gets exceeded
|
|
// test when the total size gets exceeded
|
|
assertFalse("Large size ranges shouldn't get merged", mergeBase.merge(5000, 6000,
|
|
assertFalse("Large size ranges shouldn't get merged", mergeBase.merge(5000, 6000,
|
|
- new FileRangeImpl(5000, 1000), 2001, 3999));
|
|
|
|
|
|
+ FileRange.createFileRange(5000, 1000), 2001, 3999));
|
|
assertEquals("Number of ranges in merged range shouldn't increase",
|
|
assertEquals("Number of ranges in merged range shouldn't increase",
|
|
1, mergeBase.getUnderlying().size());
|
|
1, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
@@ -117,7 +115,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
|
|
|
|
// test when the merge works
|
|
// test when the merge works
|
|
assertTrue("ranges should get merged ", mergeBase.merge(5000, 6000,
|
|
assertTrue("ranges should get merged ", mergeBase.merge(5000, 6000,
|
|
- new FileRangeImpl(5000, 1000), 2001, 4000));
|
|
|
|
|
|
+ FileRange.createFileRange(5000, 1000), 2001, 4000));
|
|
assertEquals("post merge size", 2, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge size", 2, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
assertEquals("post merge offset", 2000, mergeBase.getOffset());
|
|
assertEquals("post merge length", 4000, mergeBase.getLength());
|
|
assertEquals("post merge length", 4000, mergeBase.getLength());
|
|
@@ -127,7 +125,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
assertEquals(200, mergeBase.getOffset());
|
|
assertEquals(200, mergeBase.getOffset());
|
|
assertEquals(100, mergeBase.getLength());
|
|
assertEquals(100, mergeBase.getLength());
|
|
assertTrue("ranges should get merged ", mergeBase.merge(500, 600,
|
|
assertTrue("ranges should get merged ", mergeBase.merge(500, 600,
|
|
- new FileRangeImpl(5000, 1000), 201, 400));
|
|
|
|
|
|
+ FileRange.createFileRange(5000, 1000), 201, 400));
|
|
assertEquals("post merge size", 2, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge size", 2, mergeBase.getUnderlying().size());
|
|
assertEquals("post merge offset", 200, mergeBase.getOffset());
|
|
assertEquals("post merge offset", 200, mergeBase.getOffset());
|
|
assertEquals("post merge length", 400, mergeBase.getLength());
|
|
assertEquals("post merge length", 400, mergeBase.getLength());
|
|
@@ -136,42 +134,58 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
@Test
|
|
@Test
|
|
public void testSortAndMerge() {
|
|
public void testSortAndMerge() {
|
|
List<FileRange> input = Arrays.asList(
|
|
List<FileRange> input = Arrays.asList(
|
|
- new FileRangeImpl(3000, 100),
|
|
|
|
- new FileRangeImpl(2100, 100),
|
|
|
|
- new FileRangeImpl(1000, 100)
|
|
|
|
|
|
+ FileRange.createFileRange(3000, 100),
|
|
|
|
+ FileRange.createFileRange(2100, 100),
|
|
|
|
+ FileRange.createFileRange(1000, 100)
|
|
);
|
|
);
|
|
assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
- List<CombinedFileRange> outputList = VectoredReadUtils.sortAndMergeRanges(
|
|
|
|
- input, 100, 1001, 2500);
|
|
|
|
- assertEquals("merged range size", 1, outputList.size());
|
|
|
|
|
|
+ List<CombinedFileRange> outputList = VectoredReadUtils.mergeSortedRanges(
|
|
|
|
+ Arrays.asList(sortRanges(input)), 100, 1001, 2500);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(1);
|
|
CombinedFileRange output = outputList.get(0);
|
|
CombinedFileRange output = outputList.get(0);
|
|
- assertEquals("merged range underlying size", 3, output.getUnderlying().size());
|
|
|
|
|
|
+ Assertions.assertThat(output.getUnderlying())
|
|
|
|
+ .describedAs("merged range underlying size")
|
|
|
|
+ .hasSize(3);
|
|
assertEquals("range[1000,3100)", output.toString());
|
|
assertEquals("range[1000,3100)", output.toString());
|
|
assertTrue("merged output ranges are disjoint",
|
|
assertTrue("merged output ranges are disjoint",
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 800));
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 800));
|
|
|
|
|
|
// the minSeek doesn't allow the first two to merge
|
|
// the minSeek doesn't allow the first two to merge
|
|
- assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 100, 1000));
|
|
|
|
- outputList = VectoredReadUtils.sortAndMergeRanges(input, 100, 1000, 2100);
|
|
|
|
- assertEquals("merged range size", 2, outputList.size());
|
|
|
|
|
|
+ assertFalse("Ranges are non disjoint",
|
|
|
|
+ VectoredReadUtils.isOrderedDisjoint(input, 100, 1000));
|
|
|
|
+ outputList = VectoredReadUtils.mergeSortedRanges(Arrays.asList(sortRanges(input)),
|
|
|
|
+ 100, 1000, 2100);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(2);
|
|
assertEquals("range[1000,1100)", outputList.get(0).toString());
|
|
assertEquals("range[1000,1100)", outputList.get(0).toString());
|
|
assertEquals("range[2100,3100)", outputList.get(1).toString());
|
|
assertEquals("range[2100,3100)", outputList.get(1).toString());
|
|
assertTrue("merged output ranges are disjoint",
|
|
assertTrue("merged output ranges are disjoint",
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 1000));
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 1000));
|
|
|
|
|
|
// the maxSize doesn't allow the third range to merge
|
|
// the maxSize doesn't allow the third range to merge
|
|
- assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
|
|
- outputList = VectoredReadUtils.sortAndMergeRanges(input, 100, 1001, 2099);
|
|
|
|
- assertEquals("merged range size", 2, outputList.size());
|
|
|
|
|
|
+ assertFalse("Ranges are non disjoint",
|
|
|
|
+ VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
|
|
+ outputList = VectoredReadUtils.mergeSortedRanges(Arrays.asList(sortRanges(input)),
|
|
|
|
+ 100, 1001, 2099);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(2);
|
|
assertEquals("range[1000,2200)", outputList.get(0).toString());
|
|
assertEquals("range[1000,2200)", outputList.get(0).toString());
|
|
assertEquals("range[3000,3100)", outputList.get(1).toString());
|
|
assertEquals("range[3000,3100)", outputList.get(1).toString());
|
|
assertTrue("merged output ranges are disjoint",
|
|
assertTrue("merged output ranges are disjoint",
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 800));
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 100, 800));
|
|
|
|
|
|
// test the round up and round down (the maxSize doesn't allow any merges)
|
|
// test the round up and round down (the maxSize doesn't allow any merges)
|
|
- assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 16, 700));
|
|
|
|
- outputList = VectoredReadUtils.sortAndMergeRanges(input, 16, 1001, 100);
|
|
|
|
- assertEquals("merged range size", 3, outputList.size());
|
|
|
|
|
|
+ assertFalse("Ranges are non disjoint",
|
|
|
|
+ VectoredReadUtils.isOrderedDisjoint(input, 16, 700));
|
|
|
|
+ outputList = VectoredReadUtils.mergeSortedRanges(Arrays.asList(sortRanges(input)),
|
|
|
|
+ 16, 1001, 100);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(3);
|
|
assertEquals("range[992,1104)", outputList.get(0).toString());
|
|
assertEquals("range[992,1104)", outputList.get(0).toString());
|
|
assertEquals("range[2096,2208)", outputList.get(1).toString());
|
|
assertEquals("range[2096,2208)", outputList.get(1).toString());
|
|
assertEquals("range[2992,3104)", outputList.get(2).toString());
|
|
assertEquals("range[2992,3104)", outputList.get(2).toString());
|
|
@@ -182,26 +196,35 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
@Test
|
|
@Test
|
|
public void testSortAndMergeMoreCases() throws Exception {
|
|
public void testSortAndMergeMoreCases() throws Exception {
|
|
List<FileRange> input = Arrays.asList(
|
|
List<FileRange> input = Arrays.asList(
|
|
- new FileRangeImpl(3000, 110),
|
|
|
|
- new FileRangeImpl(3000, 100),
|
|
|
|
- new FileRangeImpl(2100, 100),
|
|
|
|
- new FileRangeImpl(1000, 100)
|
|
|
|
|
|
+ FileRange.createFileRange(3000, 110),
|
|
|
|
+ FileRange.createFileRange(3000, 100),
|
|
|
|
+ FileRange.createFileRange(2100, 100),
|
|
|
|
+ FileRange.createFileRange(1000, 100)
|
|
);
|
|
);
|
|
- assertFalse("Ranges are non disjoint", VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
|
|
- List<CombinedFileRange> outputList = VectoredReadUtils.sortAndMergeRanges(
|
|
|
|
- input, 1, 1001, 2500);
|
|
|
|
- assertEquals("merged range size", 1, outputList.size());
|
|
|
|
|
|
+ assertFalse("Ranges are non disjoint",
|
|
|
|
+ VectoredReadUtils.isOrderedDisjoint(input, 100, 800));
|
|
|
|
+ List<CombinedFileRange> outputList = VectoredReadUtils.mergeSortedRanges(
|
|
|
|
+ Arrays.asList(sortRanges(input)), 1, 1001, 2500);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(1);
|
|
CombinedFileRange output = outputList.get(0);
|
|
CombinedFileRange output = outputList.get(0);
|
|
- assertEquals("merged range underlying size", 4, output.getUnderlying().size());
|
|
|
|
|
|
+ Assertions.assertThat(output.getUnderlying())
|
|
|
|
+ .describedAs("merged range underlying size")
|
|
|
|
+ .hasSize(4);
|
|
assertEquals("range[1000,3110)", output.toString());
|
|
assertEquals("range[1000,3110)", output.toString());
|
|
assertTrue("merged output ranges are disjoint",
|
|
assertTrue("merged output ranges are disjoint",
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 1, 800));
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 1, 800));
|
|
|
|
|
|
- outputList = VectoredReadUtils.sortAndMergeRanges(
|
|
|
|
- input, 100, 1001, 2500);
|
|
|
|
- assertEquals("merged range size", 1, outputList.size());
|
|
|
|
|
|
+ outputList = VectoredReadUtils.mergeSortedRanges(
|
|
|
|
+ Arrays.asList(sortRanges(input)), 100, 1001, 2500);
|
|
|
|
+ Assertions.assertThat(outputList)
|
|
|
|
+ .describedAs("merged range size")
|
|
|
|
+ .hasSize(1);
|
|
output = outputList.get(0);
|
|
output = outputList.get(0);
|
|
- assertEquals("merged range underlying size", 4, output.getUnderlying().size());
|
|
|
|
|
|
+ Assertions.assertThat(output.getUnderlying())
|
|
|
|
+ .describedAs("merged range underlying size")
|
|
|
|
+ .hasSize(4);
|
|
assertEquals("range[1000,3200)", output.toString());
|
|
assertEquals("range[1000,3200)", output.toString());
|
|
assertTrue("merged output ranges are disjoint",
|
|
assertTrue("merged output ranges are disjoint",
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 1, 800));
|
|
VectoredReadUtils.isOrderedDisjoint(outputList, 1, 800));
|
|
@@ -211,9 +234,9 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
@Test
|
|
@Test
|
|
public void testMaxSizeZeroDisablesMering() throws Exception {
|
|
public void testMaxSizeZeroDisablesMering() throws Exception {
|
|
List<FileRange> randomRanges = Arrays.asList(
|
|
List<FileRange> randomRanges = Arrays.asList(
|
|
- new FileRangeImpl(3000, 110),
|
|
|
|
- new FileRangeImpl(3000, 100),
|
|
|
|
- new FileRangeImpl(2100, 100)
|
|
|
|
|
|
+ FileRange.createFileRange(3000, 110),
|
|
|
|
+ FileRange.createFileRange(3000, 100),
|
|
|
|
+ FileRange.createFileRange(2100, 100)
|
|
);
|
|
);
|
|
assertEqualRangeCountsAfterMerging(randomRanges, 1, 1, 0);
|
|
assertEqualRangeCountsAfterMerging(randomRanges, 1, 1, 0);
|
|
assertEqualRangeCountsAfterMerging(randomRanges, 1, 0, 0);
|
|
assertEqualRangeCountsAfterMerging(randomRanges, 1, 0, 0);
|
|
@@ -225,7 +248,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
int minimumSeek,
|
|
int minimumSeek,
|
|
int maxSize) {
|
|
int maxSize) {
|
|
List<CombinedFileRange> combinedFileRanges = VectoredReadUtils
|
|
List<CombinedFileRange> combinedFileRanges = VectoredReadUtils
|
|
- .sortAndMergeRanges(inputRanges, chunkSize, minimumSeek, maxSize);
|
|
|
|
|
|
+ .mergeSortedRanges(inputRanges, chunkSize, minimumSeek, maxSize);
|
|
Assertions.assertThat(combinedFileRanges)
|
|
Assertions.assertThat(combinedFileRanges)
|
|
.describedAs("Mismatch in number of ranges post merging")
|
|
.describedAs("Mismatch in number of ranges post merging")
|
|
.hasSize(inputRanges.size());
|
|
.hasSize(inputRanges.size());
|
|
@@ -251,7 +274,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
}).when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
}).when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
CompletableFuture<ByteBuffer> result =
|
|
CompletableFuture<ByteBuffer> result =
|
|
- VectoredReadUtils.readRangeFrom(stream, new FileRangeImpl(1000, 100),
|
|
|
|
|
|
+ VectoredReadUtils.readRangeFrom(stream, FileRange.createFileRange(1000, 100),
|
|
ByteBuffer::allocate);
|
|
ByteBuffer::allocate);
|
|
assertFutureCompletedSuccessfully(result);
|
|
assertFutureCompletedSuccessfully(result);
|
|
ByteBuffer buffer = result.get();
|
|
ByteBuffer buffer = result.get();
|
|
@@ -267,7 +290,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
.when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
.when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
result =
|
|
result =
|
|
- VectoredReadUtils.readRangeFrom(stream, new FileRangeImpl(1000, 100),
|
|
|
|
|
|
+ VectoredReadUtils.readRangeFrom(stream, FileRange.createFileRange(1000, 100),
|
|
ByteBuffer::allocate);
|
|
ByteBuffer::allocate);
|
|
assertFutureFailedExceptionally(result);
|
|
assertFutureFailedExceptionally(result);
|
|
}
|
|
}
|
|
@@ -286,7 +309,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
ArgumentMatchers.any(), ArgumentMatchers.anyInt(),
|
|
ArgumentMatchers.any(), ArgumentMatchers.anyInt(),
|
|
ArgumentMatchers.anyInt());
|
|
ArgumentMatchers.anyInt());
|
|
CompletableFuture<ByteBuffer> result =
|
|
CompletableFuture<ByteBuffer> result =
|
|
- VectoredReadUtils.readRangeFrom(stream, new FileRangeImpl(1000, 100),
|
|
|
|
|
|
+ VectoredReadUtils.readRangeFrom(stream, FileRange.createFileRange(1000, 100),
|
|
allocate);
|
|
allocate);
|
|
assertFutureCompletedSuccessfully(result);
|
|
assertFutureCompletedSuccessfully(result);
|
|
ByteBuffer buffer = result.get();
|
|
ByteBuffer buffer = result.get();
|
|
@@ -303,7 +326,7 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
ArgumentMatchers.any(), ArgumentMatchers.anyInt(),
|
|
ArgumentMatchers.any(), ArgumentMatchers.anyInt(),
|
|
ArgumentMatchers.anyInt());
|
|
ArgumentMatchers.anyInt());
|
|
result =
|
|
result =
|
|
- VectoredReadUtils.readRangeFrom(stream, new FileRangeImpl(1000, 100),
|
|
|
|
|
|
+ VectoredReadUtils.readRangeFrom(stream, FileRange.createFileRange(1000, 100),
|
|
ByteBuffer::allocate);
|
|
ByteBuffer::allocate);
|
|
assertFutureFailedExceptionally(result);
|
|
assertFutureFailedExceptionally(result);
|
|
}
|
|
}
|
|
@@ -328,9 +351,9 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
|
|
|
|
@Test
|
|
@Test
|
|
public void testReadVectored() throws Exception {
|
|
public void testReadVectored() throws Exception {
|
|
- List<FileRange> input = Arrays.asList(new FileRangeImpl(0, 100),
|
|
|
|
- new FileRangeImpl(100_000, 100),
|
|
|
|
- new FileRangeImpl(200_000, 100));
|
|
|
|
|
|
+ List<FileRange> input = Arrays.asList(FileRange.createFileRange(0, 100),
|
|
|
|
+ FileRange.createFileRange(100_000, 100),
|
|
|
|
+ FileRange.createFileRange(200_000, 100));
|
|
Stream stream = Mockito.mock(Stream.class);
|
|
Stream stream = Mockito.mock(Stream.class);
|
|
Mockito.doAnswer(invocation -> {
|
|
Mockito.doAnswer(invocation -> {
|
|
fillBuffer(invocation.getArgument(1));
|
|
fillBuffer(invocation.getArgument(1));
|
|
@@ -338,31 +361,11 @@ public class TestVectoredReadUtils extends HadoopTestBase {
|
|
}).when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
}).when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
ArgumentMatchers.any(ByteBuffer.class));
|
|
// should not merge the ranges
|
|
// should not merge the ranges
|
|
- VectoredReadUtils.readVectored(stream, input, ByteBuffer::allocate, 100, 100);
|
|
|
|
|
|
+ VectoredReadUtils.readVectored(stream, input, ByteBuffer::allocate);
|
|
Mockito.verify(stream, Mockito.times(3))
|
|
Mockito.verify(stream, Mockito.times(3))
|
|
.readFully(ArgumentMatchers.anyLong(), ArgumentMatchers.any(ByteBuffer.class));
|
|
.readFully(ArgumentMatchers.anyLong(), ArgumentMatchers.any(ByteBuffer.class));
|
|
for(int b=0; b < input.size(); ++b) {
|
|
for(int b=0; b < input.size(); ++b) {
|
|
validateBuffer("buffer " + b, input.get(b).getData().get(), 0);
|
|
validateBuffer("buffer " + b, input.get(b).getData().get(), 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- @Test
|
|
|
|
- public void testReadVectoredMerge() throws Exception {
|
|
|
|
- List<FileRange> input = Arrays.asList(new FileRangeImpl(2000, 100),
|
|
|
|
- new FileRangeImpl(1000, 100),
|
|
|
|
- new FileRangeImpl(0, 100));
|
|
|
|
- Stream stream = Mockito.mock(Stream.class);
|
|
|
|
- Mockito.doAnswer(invocation -> {
|
|
|
|
- fillBuffer(invocation.getArgument(1));
|
|
|
|
- return null;
|
|
|
|
- }).when(stream).readFully(ArgumentMatchers.anyLong(),
|
|
|
|
- ArgumentMatchers.any(ByteBuffer.class));
|
|
|
|
- // should merge the ranges into a single read
|
|
|
|
- VectoredReadUtils.readVectored(stream, input, ByteBuffer::allocate, 1000, 2100);
|
|
|
|
- Mockito.verify(stream, Mockito.times(1))
|
|
|
|
- .readFully(ArgumentMatchers.anyLong(), ArgumentMatchers.any(ByteBuffer.class));
|
|
|
|
- for(int b=0; b < input.size(); ++b) {
|
|
|
|
- validateBuffer("buffer " + b, input.get(b).getData().get(), (2 - b) * 1000);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|