snvijaya commented on a change in pull request #2464:
URL: https://github.com/apache/hadoop/pull/2464#discussion_r544826406
##########
File path:
hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsInputStream.java
##########
@@ -206,11 +231,121 @@ private int readOneBlock(final byte[] b, final int off,
final int len) throws IO
fCursor += bytesRead;
fCursorAfterLastRead = fCursor;
}
+ return copyToUserBuffer(b, off, len);
+ }
+
+ private int readFileCompletely(final byte[] b, final int off, final int len)
+ throws IOException {
+ if (len == 0) {
+ return 0;
+ }
+ if (!validate(b, off, len)) {
+ return -1;
+ }
+ savePointerState();
+ // data need to be copied to user buffer from index bCursor, bCursor has
+ // to be the current fCusor
+ bCursor = (int) fCursor;
+ return optimisedRead(b, off, len, 0, contentLength);
+ }
+
+ private int readLastBlock(final byte[] b, final int off, final int len)
+ throws IOException {
+ if (len == 0) {
+ return 0;
+ }
+ if (!validate(b, off, len)) {
+ return -1;
+ }
+ savePointerState();
+ // data need to be copied to user buffer from index bCursor,
+ // AbfsInutStream buffer is going to contain data from last block start. In
+ // that case bCursor will be set to fCursor - lastBlockStart
+ long lastBlockStart = max(0, contentLength - bufferSize);
+ bCursor = (int) (fCursor - lastBlockStart);
+ // 0 if contentlength is < buffersize
+ long actualLenToRead = min(bufferSize, contentLength);
+ return optimisedRead(b, off, len, lastBlockStart, actualLenToRead);
+ }
+
+ private int optimisedRead(final byte[] b, final int off, final int len,
+ final long readFrom, final long actualLen) throws IOException {
+ fCursor = readFrom;
+ int totalBytesRead = 0;
+ int lastBytesRead = 0;
+ try {
+ buffer = new byte[bufferSize];
+ for (int i = 0;
+ i < MAX_OPTIMIZED_READ_ATTEMPTS && fCursor < contentLength; i++) {
+ lastBytesRead = readInternal(fCursor, buffer, limit,
+ (int) actualLen - limit, true);
+ if (lastBytesRead > 0) {
+ totalBytesRead += lastBytesRead;
+ limit += lastBytesRead;
+ fCursor += lastBytesRead;
+ fCursorAfterLastRead = fCursor;
+ }
+ }
+ } catch (IOException e) {
+ LOG.debug("Optimized read failed. Defaulting to readOneBlock {}", e);
+ restorePointerState();
+ return readOneBlock(b, off, len);
+ }
+ firstRead = false;
+ if (totalBytesRead < 1) {
+ return lastBytesRead;
Review comment:
Restore needed in case of no read to get the file pointer to where app
had set it earlier. Also return explicit -1 as it is a no data read case.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]