|
@@ -44,7 +44,6 @@ import org.apache.hadoop.hdfs.security.token.block.BlockTokenIdentifier;
|
|
import org.apache.hadoop.hdfs.server.datanode.CachingStrategy;
|
|
import org.apache.hadoop.hdfs.server.datanode.CachingStrategy;
|
|
import org.apache.hadoop.hdfs.shortcircuit.ClientMmap;
|
|
import org.apache.hadoop.hdfs.shortcircuit.ClientMmap;
|
|
import org.apache.hadoop.io.IOUtils;
|
|
import org.apache.hadoop.io.IOUtils;
|
|
-import org.apache.hadoop.net.NetUtils;
|
|
|
|
import org.apache.hadoop.security.token.Token;
|
|
import org.apache.hadoop.security.token.Token;
|
|
import org.apache.hadoop.util.DataChecksum;
|
|
import org.apache.hadoop.util.DataChecksum;
|
|
import org.apache.htrace.core.TraceScope;
|
|
import org.apache.htrace.core.TraceScope;
|
|
@@ -93,11 +92,6 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
*/
|
|
*/
|
|
private final long bytesNeededToFinish;
|
|
private final long bytesNeededToFinish;
|
|
|
|
|
|
- /**
|
|
|
|
- * True if we are reading from a local DataNode.
|
|
|
|
- */
|
|
|
|
- private final boolean isLocal;
|
|
|
|
-
|
|
|
|
private boolean eos = false;
|
|
private boolean eos = false;
|
|
private boolean sentStatusCode = false;
|
|
private boolean sentStatusCode = false;
|
|
|
|
|
|
@@ -109,6 +103,8 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
|
|
|
|
private final Tracer tracer;
|
|
private final Tracer tracer;
|
|
|
|
|
|
|
|
+ private final int networkDistance;
|
|
|
|
+
|
|
/* FSInputChecker interface */
|
|
/* FSInputChecker interface */
|
|
|
|
|
|
/* same interface as inputStream java.io.InputStream#read()
|
|
/* same interface as inputStream java.io.InputStream#read()
|
|
@@ -342,7 +338,8 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
private RemoteBlockReader(String file, String bpid, long blockId,
|
|
private RemoteBlockReader(String file, String bpid, long blockId,
|
|
DataInputStream in, DataChecksum checksum, boolean verifyChecksum,
|
|
DataInputStream in, DataChecksum checksum, boolean verifyChecksum,
|
|
long startOffset, long firstChunkOffset, long bytesToRead, Peer peer,
|
|
long startOffset, long firstChunkOffset, long bytesToRead, Peer peer,
|
|
- DatanodeID datanodeID, PeerCache peerCache, Tracer tracer) {
|
|
|
|
|
|
+ DatanodeID datanodeID, PeerCache peerCache, Tracer tracer,
|
|
|
|
+ int networkDistance) {
|
|
// Path is used only for printing block and file information in debug
|
|
// Path is used only for printing block and file information in debug
|
|
super(new Path("/" + Block.BLOCK_FILE_PREFIX + blockId +
|
|
super(new Path("/" + Block.BLOCK_FILE_PREFIX + blockId +
|
|
":" + bpid + ":of:"+ file)/*too non path-like?*/,
|
|
":" + bpid + ":of:"+ file)/*too non path-like?*/,
|
|
@@ -351,9 +348,6 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
checksum.getBytesPerChecksum(),
|
|
checksum.getBytesPerChecksum(),
|
|
checksum.getChecksumSize());
|
|
checksum.getChecksumSize());
|
|
|
|
|
|
- this.isLocal = DFSUtilClient.isLocalAddress(NetUtils.
|
|
|
|
- createSocketAddr(datanodeID.getXferAddr()));
|
|
|
|
-
|
|
|
|
this.peer = peer;
|
|
this.peer = peer;
|
|
this.datanodeID = datanodeID;
|
|
this.datanodeID = datanodeID;
|
|
this.in = in;
|
|
this.in = in;
|
|
@@ -375,6 +369,7 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
checksumSize = this.checksum.getChecksumSize();
|
|
checksumSize = this.checksum.getChecksumSize();
|
|
this.peerCache = peerCache;
|
|
this.peerCache = peerCache;
|
|
this.tracer = tracer;
|
|
this.tracer = tracer;
|
|
|
|
+ this.networkDistance = networkDistance;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -400,7 +395,7 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
DatanodeID datanodeID,
|
|
DatanodeID datanodeID,
|
|
PeerCache peerCache,
|
|
PeerCache peerCache,
|
|
CachingStrategy cachingStrategy,
|
|
CachingStrategy cachingStrategy,
|
|
- Tracer tracer)
|
|
|
|
|
|
+ Tracer tracer, int networkDistance)
|
|
throws IOException {
|
|
throws IOException {
|
|
// in and out will be closed when sock is closed (by the caller)
|
|
// in and out will be closed when sock is closed (by the caller)
|
|
final DataOutputStream out =
|
|
final DataOutputStream out =
|
|
@@ -436,7 +431,7 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
|
|
|
|
return new RemoteBlockReader(file, block.getBlockPoolId(), block.getBlockId(),
|
|
return new RemoteBlockReader(file, block.getBlockPoolId(), block.getBlockId(),
|
|
in, checksum, verifyChecksum, startOffset, firstChunkOffset, len,
|
|
in, checksum, verifyChecksum, startOffset, firstChunkOffset, len,
|
|
- peer, datanodeID, peerCache, tracer);
|
|
|
|
|
|
+ peer, datanodeID, peerCache, tracer, networkDistance);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -493,11 +488,6 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
return RemoteBlockReader2.TCP_WINDOW_SIZE;
|
|
return RemoteBlockReader2.TCP_WINDOW_SIZE;
|
|
}
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
|
- public boolean isLocal() {
|
|
|
|
- return isLocal;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public boolean isShortCircuit() {
|
|
public boolean isShortCircuit() {
|
|
return false;
|
|
return false;
|
|
@@ -507,4 +497,9 @@ public class RemoteBlockReader extends FSInputChecker implements BlockReader {
|
|
public ClientMmap getClientMmap(EnumSet<ReadOption> opts) {
|
|
public ClientMmap getClientMmap(EnumSet<ReadOption> opts) {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int getNetworkDistance() {
|
|
|
|
+ return networkDistance;
|
|
|
|
+ }
|
|
}
|
|
}
|