Repository: hadoop Updated Branches: refs/heads/branch-2.7 17dbf82f5 -> ec459e396
HDFS-10182. Hedged read might overwrite user's buf. Contributed by zhouyingchao. (cherry picked from commit d8383c687c95dbb37effa307ab2d41497da1cfc2) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ec459e39 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ec459e39 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ec459e39 Branch: refs/heads/branch-2.7 Commit: ec459e396661cbef27d43dd8e818680b0fd3631c Parents: 17dbf82 Author: Walter Su <waltersu4...@apache.org> Authored: Mon Mar 28 15:44:25 2016 +0800 Committer: Walter Su <waltersu4...@apache.org> Committed: Mon Mar 28 15:46:15 2016 +0800 ---------------------------------------------------------------------- .../java/org/apache/hadoop/hdfs/DFSInputStream.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/ec459e39/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java index 19dde1f..2940f35 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSInputStream.java @@ -1249,7 +1249,7 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead, // chooseDataNode is a commitment. If no node, we go to // the NN to reget block locations. Only go here on first read. chosenNode = chooseDataNode(block, ignored); - bb = ByteBuffer.wrap(buf, offset, len); + bb = ByteBuffer.allocate(len); Callable<ByteBuffer> getFromDataNodeCallable = getFromOneDataNode( chosenNode, block, start, end, bb, corruptedBlockMap, hedgedReadId++); @@ -1260,7 +1260,9 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead, Future<ByteBuffer> future = hedgedService.poll( dfsClient.getHedgedReadTimeout(), TimeUnit.MILLISECONDS); if (future != null) { - future.get(); + ByteBuffer result = future.get(); + System.arraycopy(result.array(), result.position(), buf, offset, + len); return; } if (DFSClient.LOG.isDebugEnabled()) { @@ -1306,13 +1308,9 @@ implements ByteBufferReadable, CanSetDropBehind, CanSetReadahead, ByteBuffer result = getFirstToComplete(hedgedService, futures); // cancel the rest. cancelAll(futures); - if (result.array() != buf) { // compare the array pointers - dfsClient.getHedgedReadMetrics().incHedgedReadWins(); - System.arraycopy(result.array(), result.position(), buf, offset, - len); - } else { - dfsClient.getHedgedReadMetrics().incHedgedReadOps(); - } + dfsClient.getHedgedReadMetrics().incHedgedReadWins(); + System.arraycopy(result.array(), result.position(), buf, offset, + len); return; } catch (InterruptedException ie) { // Ignore and retry