// cached block locations may have been updated by chooseDatNode()
// or fetchBlockAt(). Always get the latest list of locations at the
// start of the loop.
block = getBlockAt(block.getStartOffset(), false, true);
DNAddrPair retval = chooseDataNode(block);
DatanodeInfo chosenNode = retval.info;
InetSocketAddress targetAddr = retval.addr;
BlockReader reader = null;
int len = (int) (end - start + 1);
try {
if (DFSClient.LOG.isDebugEnabled()) {
DFSClient.LOG.debug("fetchBlockByteRange shortCircuitLocalReads " +
dfsClient.shortCircuitLocalReads +
" localhst " + dfsClient.localHost +
" targetAddr " + targetAddr);
}
// first try reading the block locally.
if (dfsClient.shortCircuitLocalReads &&
NetUtils.isLocalAddressWithCaching(targetAddr.getAddress())) {
reader = BlockReaderLocal.newBlockReader(dfsClient.conf, src,
namespaceId, block.getBlock(),
chosenNode,
start,
len,
dfsClient.metrics,
verifyChecksum,
this.clearOsBuffer);
reader.setReadLocal(true);
reader.setFsStats(dfsClient.stats);
} else {
// go to the datanode
dn = dfsClient.socketFactory.createSocket();
NetUtils.connect(dn, targetAddr, dfsClient.socketTimeout,
dfsClient.ipTosValue);
dn.setSoTimeout(dfsClient.socketTimeout);
reader = BlockReader.newBlockReader(dfsClient.getDataTransferProtocolVersion(),
namespaceId,
dn, src,
block.getBlock().getBlockId(),
block.getBlock().getGenerationStamp(),
start, len, buffersize,
verifyChecksum, dfsClient.clientName,
dfsClient.minReadSpeedBps);
boolean isLocalHost = NetUtils.isLocalAddress(targetAddr.getAddress());
reader.setReadLocal(isLocalHost);
if (!isLocalHost) {
reader.setReadRackLocal(
dfsClient.isInLocalRack(targetAddr.getAddress()));
}
reader.setFsStats(dfsClient.stats);
}
int nread = reader.readAll(buf, offset, len);
if (nread != len) {
throw new IOException("truncated return from reader.read(): " +
"excpected " + len + ", got " + nread);
}
return;
} catch (ChecksumException e) {
DFSClient.LOG.warn("fetchBlockByteRange(). Got a checksum exception for " +
src + " at " + block.getBlock() + ":" +
e.getPos() + " from " + chosenNode.getName());
dfsClient.reportChecksumFailure(src, block.getBlock(), chosenNode);
} catch (IOException e) {
DFSClient.LOG.warn("Failed to connect to " + targetAddr +
" for file " + src +
" for block " + block.getBlock().getBlockId() + ":" +