HDDS-639. ChunkGroupInputStream gets into infinite loop after reading a block. Contributed by Mukul Kumar Singh.
(cherry picked from commit 56b18b9df14b91c02cf3b7f548ab58755475b374) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ca1d4c46 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ca1d4c46 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ca1d4c46 Branch: refs/heads/ozone-0.3 Commit: ca1d4c46dd4cd81c46aed87cd7a52af3e6be504f Parents: 2cad68b Author: Arpit Agarwal <[email protected]> Authored: Fri Oct 12 13:33:38 2018 -0700 Committer: Arpit Agarwal <[email protected]> Committed: Fri Oct 12 13:33:45 2018 -0700 ---------------------------------------------------------------------- .../hadoop/ozone/client/io/ChunkGroupInputStream.java | 6 +++++- .../apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/ca1d4c46/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ChunkGroupInputStream.java ---------------------------------------------------------------------- diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ChunkGroupInputStream.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ChunkGroupInputStream.java index 7791613..125784c 100644 --- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ChunkGroupInputStream.java +++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ChunkGroupInputStream.java @@ -111,7 +111,11 @@ public class ChunkGroupInputStream extends InputStream implements Seekable { } int totalReadLen = 0; while (len > 0) { - if (streamEntries.size() <= currentStreamIndex) { + // if we are at the last block and have read the entire block, return + if (streamEntries.size() == 0 || + (streamEntries.size() - 1 <= currentStreamIndex && + streamEntries.get(currentStreamIndex) + .getRemaining() == 0)) { return totalReadLen == 0 ? EOF : totalReadLen; } ChunkInputStreamEntry current = streamEntries.get(currentStreamIndex); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ca1d4c46/hadoop-ozone/ozonefs/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java ---------------------------------------------------------------------- diff --git a/hadoop-ozone/ozonefs/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java b/hadoop-ozone/ozonefs/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java index 7cf6e3d..2176031 100644 --- a/hadoop-ozone/ozonefs/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java +++ b/hadoop-ozone/ozonefs/src/test/java/org/apache/hadoop/fs/ozone/TestOzoneFileInterfaces.java @@ -174,9 +174,18 @@ public class TestOzoneFileInterfaces { try (FSDataInputStream inputStream = fs.open(path)) { byte[] buffer = new byte[stringLen]; - inputStream.readFully(0, buffer); + // This read will not change the offset inside the file + int readBytes = inputStream.read(0, buffer, 0, buffer.length); String out = new String(buffer, 0, buffer.length); assertEquals(data, out); + assertEquals(readBytes, buffer.length); + assertEquals(0, inputStream.getPos()); + + // The following read will change the internal offset + readBytes = inputStream.read(buffer, 0, buffer.length); + assertEquals(data, out); + assertEquals(readBytes, buffer.length); + assertEquals(buffer.length, inputStream.getPos()); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
