HDDS-639. ChunkGroupInputStream gets into infinite loop after reading a block. Contributed by Mukul Kumar Singh.

(cherry picked from commit 56b18b9df1)
This commit is contained in:
Arpit Agarwal 2018-10-12 13:33:38 -07:00
parent 2cad68b486
commit ca1d4c46dd
2 changed files with 15 additions and 2 deletions

View File

@ -111,7 +111,11 @@ public class ChunkGroupInputStream extends InputStream implements Seekable {
} }
int totalReadLen = 0; int totalReadLen = 0;
while (len > 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; return totalReadLen == 0 ? EOF : totalReadLen;
} }
ChunkInputStreamEntry current = streamEntries.get(currentStreamIndex); ChunkInputStreamEntry current = streamEntries.get(currentStreamIndex);

View File

@ -174,9 +174,18 @@ public class TestOzoneFileInterfaces {
try (FSDataInputStream inputStream = fs.open(path)) { try (FSDataInputStream inputStream = fs.open(path)) {
byte[] buffer = new byte[stringLen]; 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); String out = new String(buffer, 0, buffer.length);
assertEquals(data, out); 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());
} }
} }