From d629b776853809819a756f7573ab620170ca7ae3 Mon Sep 17 00:00:00 2001 From: HarshitGupta11 Date: Mon, 28 Nov 2022 14:04:26 +0530 Subject: [PATCH 1/3] HADOOP-18530 --- .../src/main/java/org/apache/hadoop/fs/VectoredReadUtils.java | 1 + .../test/java/org/apache/hadoop/fs/TestVectoredReadUtils.java | 3 +++ 2 files changed, 4 insertions(+) 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 50cab7dc4ccf8..894639d1b4313 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 @@ -310,6 +310,7 @@ public static ByteBuffer sliceTo(ByteBuffer readData, long readOffset, readData = readData.slice(); readData.position(offsetChange); readData.limit(offsetChange + requestLength); + readData = readData.slice(); return readData; } 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 fdfa8f6eb6f62..9ec8a90b19504 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 @@ -77,6 +77,9 @@ public void testSliceTo() { .describedAs("Slicing should use the same underlying " + "data") .isEqualTo(slice.array()); + Assertions.assertThat(buffer.position()) + .describedAs("Slicing should return buffers starting from position 0") + .isEqualTo(0); // test the contents of the slice intBuffer = slice.asIntBuffer(); for(int i=0; i < sliceLength / Integer.BYTES; ++i) { From 3d95bb10bd30ea6aaeb113411dc4fffe77b2a59a Mon Sep 17 00:00:00 2001 From: HarshitGupta11 Date: Mon, 28 Nov 2022 14:17:36 +0530 Subject: [PATCH 2/3] HADOOP-18530 Fixed the test --- .../java/org/apache/hadoop/fs/TestVectoredReadUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 9ec8a90b19504..e964d23f4b750 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 @@ -61,6 +61,9 @@ public void testSliceTo() { .describedAs("Slicing on the same offset shouldn't " + "create a new buffer") .isEqualTo(slice); + Assertions.assertThat(slice.position()) + .describedAs("Slicing should return buffers starting from position 0") + .isEqualTo(0); // try slicing a range final int offset = 100; @@ -77,7 +80,7 @@ public void testSliceTo() { .describedAs("Slicing should use the same underlying " + "data") .isEqualTo(slice.array()); - Assertions.assertThat(buffer.position()) + Assertions.assertThat(slice.position()) .describedAs("Slicing should return buffers starting from position 0") .isEqualTo(0); // test the contents of the slice From bb52ba464076ffe165b6173724df26996477e378 Mon Sep 17 00:00:00 2001 From: HarshitGupta11 Date: Tue, 29 Nov 2022 11:41:46 +0530 Subject: [PATCH 3/3] Added comments --- .../main/java/org/apache/hadoop/fs/VectoredReadUtils.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 894639d1b4313..cf1b1ef969863 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 @@ -307,9 +307,15 @@ public static ByteBuffer sliceTo(ByteBuffer readData, long readOffset, FileRange request) { int offsetChange = (int) (request.getOffset() - readOffset); int requestLength = request.getLength(); + // Create a new buffer that is backed by the original contents + // The buffer will have position 0 and the same limit as the original one readData = readData.slice(); + // Change the offset and the limit of the buffer as the reader wants to see + // only relevant data readData.position(offsetChange); readData.limit(offsetChange + requestLength); + // Create a new buffer after the limit change so that only that portion of the data is + // returned to the reader. readData = readData.slice(); return readData; }