|
@@ -24,6 +24,7 @@ import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicy;
|
|
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
|
|
import org.apache.hadoop.hdfs.protocol.ExtendedBlock;
|
|
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
|
|
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil;
|
|
|
|
+import org.apache.hadoop.hdfs.util.StripedBlockUtil.BlockReadStats;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.StripingChunk;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.StripingChunk;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.AlignedStripe;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.AlignedStripe;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.StripingChunkReadResult;
|
|
import org.apache.hadoop.hdfs.util.StripedBlockUtil.StripingChunkReadResult;
|
|
@@ -105,9 +106,10 @@ abstract class StripeReader {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- protected final Map<Future<Void>, Integer> futures = new HashMap<>();
|
|
|
|
|
|
+ private final Map<Future<BlockReadStats>, Integer> futures =
|
|
|
|
+ new HashMap<>();
|
|
protected final AlignedStripe alignedStripe;
|
|
protected final AlignedStripe alignedStripe;
|
|
- protected final CompletionService<Void> service;
|
|
|
|
|
|
+ private final CompletionService<BlockReadStats> service;
|
|
protected final LocatedBlock[] targetBlocks;
|
|
protected final LocatedBlock[] targetBlocks;
|
|
protected final CorruptedBlocks corruptedBlocks;
|
|
protected final CorruptedBlocks corruptedBlocks;
|
|
protected final BlockReaderInfo[] readerInfos;
|
|
protected final BlockReaderInfo[] readerInfos;
|
|
@@ -257,7 +259,7 @@ abstract class StripeReader {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private Callable<Void> readCells(final BlockReader reader,
|
|
|
|
|
|
+ private Callable<BlockReadStats> readCells(final BlockReader reader,
|
|
final DatanodeInfo datanode, final long currentReaderOffset,
|
|
final DatanodeInfo datanode, final long currentReaderOffset,
|
|
final long targetReaderOffset, final ByteBufferStrategy[] strategies,
|
|
final long targetReaderOffset, final ByteBufferStrategy[] strategies,
|
|
final ExtendedBlock currentBlock) {
|
|
final ExtendedBlock currentBlock) {
|
|
@@ -275,10 +277,13 @@ abstract class StripeReader {
|
|
skipped == targetReaderOffset - currentReaderOffset);
|
|
skipped == targetReaderOffset - currentReaderOffset);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ int ret = 0;
|
|
for (ByteBufferStrategy strategy : strategies) {
|
|
for (ByteBufferStrategy strategy : strategies) {
|
|
- readToBuffer(reader, datanode, strategy, currentBlock);
|
|
|
|
|
|
+ int bytesReead = readToBuffer(reader, datanode, strategy, currentBlock);
|
|
|
|
+ ret += bytesReead;
|
|
}
|
|
}
|
|
- return null;
|
|
|
|
|
|
+ return new BlockReadStats(ret, reader.isShortCircuit(),
|
|
|
|
+ reader.getNetworkDistance());
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
@@ -303,13 +308,14 @@ abstract class StripeReader {
|
|
}
|
|
}
|
|
|
|
|
|
chunk.state = StripingChunk.PENDING;
|
|
chunk.state = StripingChunk.PENDING;
|
|
- Callable<Void> readCallable = readCells(readerInfos[chunkIndex].reader,
|
|
|
|
|
|
+ Callable<BlockReadStats> readCallable =
|
|
|
|
+ readCells(readerInfos[chunkIndex].reader,
|
|
readerInfos[chunkIndex].datanode,
|
|
readerInfos[chunkIndex].datanode,
|
|
readerInfos[chunkIndex].blockReaderOffset,
|
|
readerInfos[chunkIndex].blockReaderOffset,
|
|
alignedStripe.getOffsetInBlock(), getReadStrategies(chunk),
|
|
alignedStripe.getOffsetInBlock(), getReadStrategies(chunk),
|
|
block.getBlock());
|
|
block.getBlock());
|
|
|
|
|
|
- Future<Void> request = service.submit(readCallable);
|
|
|
|
|
|
+ Future<BlockReadStats> request = service.submit(readCallable);
|
|
futures.put(request, chunkIndex);
|
|
futures.put(request, chunkIndex);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -342,6 +348,7 @@ abstract class StripeReader {
|
|
try {
|
|
try {
|
|
StripingChunkReadResult r = StripedBlockUtil
|
|
StripingChunkReadResult r = StripedBlockUtil
|
|
.getNextCompletedStripedRead(service, futures, 0);
|
|
.getNextCompletedStripedRead(service, futures, 0);
|
|
|
|
+ dfsStripedInputStream.updateReadStats(r.getReadStats());
|
|
if (DFSClient.LOG.isDebugEnabled()) {
|
|
if (DFSClient.LOG.isDebugEnabled()) {
|
|
DFSClient.LOG.debug("Read task returned: " + r + ", for stripe "
|
|
DFSClient.LOG.debug("Read task returned: " + r + ", for stripe "
|
|
+ alignedStripe);
|
|
+ alignedStripe);
|
|
@@ -460,7 +467,7 @@ abstract class StripeReader {
|
|
}
|
|
}
|
|
|
|
|
|
void clearFutures() {
|
|
void clearFutures() {
|
|
- for (Future<Void> future : futures.keySet()) {
|
|
|
|
|
|
+ for (Future future : futures.keySet()) {
|
|
future.cancel(false);
|
|
future.cancel(false);
|
|
}
|
|
}
|
|
futures.clear();
|
|
futures.clear();
|