|
@@ -74,6 +74,9 @@ import org.apache.hadoop.security.token.Token;
|
|
|
import org.apache.hadoop.util.IdentityHashStore;
|
|
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
+import org.htrace.Span;
|
|
|
+import org.htrace.Trace;
|
|
|
+import org.htrace.TraceScope;
|
|
|
|
|
|
/****************************************************************
|
|
|
* DFSInputStream provides bytes from a named file. It handles
|
|
@@ -840,15 +843,25 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
@Override
|
|
|
public synchronized int read(final byte buf[], int off, int len) throws IOException {
|
|
|
ReaderStrategy byteArrayReader = new ByteArrayStrategy(buf);
|
|
|
-
|
|
|
- return readWithStrategy(byteArrayReader, off, len);
|
|
|
+ TraceScope scope =
|
|
|
+ dfsClient.getPathTraceScope("DFSInputStream#byteArrayRead", src);
|
|
|
+ try {
|
|
|
+ return readWithStrategy(byteArrayReader, off, len);
|
|
|
+ } finally {
|
|
|
+ scope.close();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public synchronized int read(final ByteBuffer buf) throws IOException {
|
|
|
ReaderStrategy byteBufferReader = new ByteBufferStrategy(buf);
|
|
|
-
|
|
|
- return readWithStrategy(byteBufferReader, 0, buf.remaining());
|
|
|
+ TraceScope scope =
|
|
|
+ dfsClient.getPathTraceScope("DFSInputStream#byteBufferRead", src);
|
|
|
+ try {
|
|
|
+ return readWithStrategy(byteBufferReader, 0, buf.remaining());
|
|
|
+ } finally {
|
|
|
+ scope.close();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -984,15 +997,23 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
private Callable<ByteBuffer> getFromOneDataNode(final DNAddrPair datanode,
|
|
|
final LocatedBlock block, final long start, final long end,
|
|
|
final ByteBuffer bb,
|
|
|
- final Map<ExtendedBlock, Set<DatanodeInfo>> corruptedBlockMap) {
|
|
|
+ final Map<ExtendedBlock, Set<DatanodeInfo>> corruptedBlockMap,
|
|
|
+ final int hedgedReadId) {
|
|
|
+ final Span parentSpan = Trace.currentSpan();
|
|
|
return new Callable<ByteBuffer>() {
|
|
|
@Override
|
|
|
public ByteBuffer call() throws Exception {
|
|
|
byte[] buf = bb.array();
|
|
|
int offset = bb.position();
|
|
|
- actualGetFromOneDataNode(datanode, block, start, end, buf, offset,
|
|
|
- corruptedBlockMap);
|
|
|
- return bb;
|
|
|
+ TraceScope scope =
|
|
|
+ Trace.startSpan("hedgedRead" + hedgedReadId, parentSpan);
|
|
|
+ try {
|
|
|
+ actualGetFromOneDataNode(datanode, block, start, end, buf, offset,
|
|
|
+ corruptedBlockMap);
|
|
|
+ return bb;
|
|
|
+ } finally {
|
|
|
+ scope.close();
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
}
|
|
@@ -1108,6 +1129,7 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
ArrayList<DatanodeInfo> ignored = new ArrayList<DatanodeInfo>();
|
|
|
ByteBuffer bb = null;
|
|
|
int len = (int) (end - start + 1);
|
|
|
+ int hedgedReadId = 0;
|
|
|
block = getBlockAt(block.getStartOffset(), false);
|
|
|
while (true) {
|
|
|
// see HDFS-6591, this metric is used to verify/catch unnecessary loops
|
|
@@ -1120,7 +1142,8 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
chosenNode = chooseDataNode(block, ignored);
|
|
|
bb = ByteBuffer.wrap(buf, offset, len);
|
|
|
Callable<ByteBuffer> getFromDataNodeCallable = getFromOneDataNode(
|
|
|
- chosenNode, block, start, end, bb, corruptedBlockMap);
|
|
|
+ chosenNode, block, start, end, bb, corruptedBlockMap,
|
|
|
+ hedgedReadId++);
|
|
|
Future<ByteBuffer> firstRequest = hedgedService
|
|
|
.submit(getFromDataNodeCallable);
|
|
|
futures.add(firstRequest);
|
|
@@ -1157,7 +1180,8 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
}
|
|
|
bb = ByteBuffer.allocate(len);
|
|
|
Callable<ByteBuffer> getFromDataNodeCallable = getFromOneDataNode(
|
|
|
- chosenNode, block, start, end, bb, corruptedBlockMap);
|
|
|
+ chosenNode, block, start, end, bb, corruptedBlockMap,
|
|
|
+ hedgedReadId++);
|
|
|
Future<ByteBuffer> oneMoreRequest = hedgedService
|
|
|
.submit(getFromDataNodeCallable);
|
|
|
futures.add(oneMoreRequest);
|
|
@@ -1272,7 +1296,18 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead,
|
|
|
*/
|
|
|
@Override
|
|
|
public int read(long position, byte[] buffer, int offset, int length)
|
|
|
- throws IOException {
|
|
|
+ throws IOException {
|
|
|
+ TraceScope scope =
|
|
|
+ dfsClient.getPathTraceScope("DFSInputStream#byteArrayPread", src);
|
|
|
+ try {
|
|
|
+ return pread(position, buffer, offset, length);
|
|
|
+ } finally {
|
|
|
+ scope.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private int pread(long position, byte[] buffer, int offset, int length)
|
|
|
+ throws IOException {
|
|
|
// sanity checks
|
|
|
dfsClient.checkOpen();
|
|
|
if (closed) {
|