diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java index 2c42cbe5bb0..3b9210a3635 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java @@ -2966,6 +2966,25 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory, return scope; } + /** + * Full detailed tracing for read requests: path, position in the file, + * and length. + * + * @param reqLen requested length + */ + TraceScope newReaderTraceScope(String description, String path, long pos, + int reqLen) { + TraceScope scope = newPathTraceScope(description, path); + scope.addKVAnnotation("pos", Long.toString(pos)); + scope.addKVAnnotation("reqLen", Integer.toString(reqLen)); + return scope; + } + + /** Add the returned length info to the scope. */ + void addRetLenToReaderScope(TraceScope scope, int retLen) { + scope.addKVAnnotation("retLen", Integer.toString(retLen)); + } + /** * Get the erasure coding policy information for the specified path * diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java index b6b11ee1392..3de60b24d44 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java @@ -973,18 +973,29 @@ public class DFSInputStream extends FSInputStream public synchronized int read(@Nonnull final byte buf[], int off, int len) throws IOException { ReaderStrategy byteArrayReader = new ByteArrayStrategy(buf); - try (TraceScope ignored = - dfsClient.newPathTraceScope("DFSInputStream#byteArrayRead", src)) { - return readWithStrategy(byteArrayReader, off, len); + try (TraceScope scope = + dfsClient.newReaderTraceScope("DFSInputStream#byteArrayRead", + src, getPos(), len)) { + int retLen = readWithStrategy(byteArrayReader, off, len); + if (retLen < len) { + dfsClient.addRetLenToReaderScope(scope, retLen); + } + return retLen; } } @Override public synchronized int read(final ByteBuffer buf) throws IOException { ReaderStrategy byteBufferReader = new ByteBufferStrategy(buf); - try (TraceScope ignored = - dfsClient.newPathTraceScope("DFSInputStream#byteBufferRead", src)){ - return readWithStrategy(byteBufferReader, 0, buf.remaining()); + int reqLen = buf.remaining(); + try (TraceScope scope = + dfsClient.newReaderTraceScope("DFSInputStream#byteBufferRead", + src, getPos(), reqLen)){ + int retLen = readWithStrategy(byteBufferReader, 0, reqLen); + if (retLen < reqLen) { + dfsClient.addRetLenToReaderScope(scope, retLen); + } + return retLen; } } @@ -1433,9 +1444,14 @@ public class DFSInputStream extends FSInputStream @Override public int read(long position, byte[] buffer, int offset, int length) throws IOException { - try (TraceScope ignored = dfsClient. - newPathTraceScope("DFSInputStream#byteArrayPread", src)) { - return pread(position, buffer, offset, length); + try (TraceScope scope = dfsClient. + newReaderTraceScope("DFSInputStream#byteArrayPread", + src, position, length)) { + int retLen = pread(position, buffer, offset, length); + if (retLen < length) { + dfsClient.addRetLenToReaderScope(scope, retLen); + } + return retLen; } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index e6074bd217b..7a5290e97ba 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -936,6 +936,9 @@ Release 2.9.0 - UNRELEASED HDFS-9624. DataNode start slowly due to the initial DU command operations. (Lin Yiqun via wang) + HDFS-9576: HTrace: collect position/length information on read operations + (zhz via cmccabe) + OPTIMIZATIONS BUG FIXES