diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index bab5ca6f72..382f5b2c6f 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -744,6 +744,9 @@ Release 2.0.2-alpha - 2012-09-07 HDFS-3809. Make BKJM use protobufs for all serialization with ZK.(Ivan Kelly via umamahesh) HDFS-3895. hadoop-client must include commons-cli (tucu) + + HDFS-2757. Cannot read a local block that's being written to when + using the local read short circuit. (Jean-Daniel Cryans via eli) BREAKDOWN OF HDFS-3042 SUBTASKS diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClient.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClient.java index 5d8cba7e9e..53b6466202 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClient.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClient.java @@ -2074,10 +2074,7 @@ public class DFSClient implements java.io.Closeable { } boolean shouldTryShortCircuitRead(InetSocketAddress targetAddr) { - if (shortCircuitLocalReads && isLocalAddress(targetAddr)) { - return true; - } - return false; + return shortCircuitLocalReads && isLocalAddress(targetAddr); } void reportChecksumFailure(String file, ExtendedBlock blk, DatanodeInfo dn) { 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 ee4dc8918c..f14704053c 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 @@ -243,6 +243,10 @@ public class DFSInputStream extends FSInputStream implements ByteBufferReadable locatedBlocks.getFileLength() + lastBlockBeingWrittenLength; } + private synchronized boolean blockUnderConstruction() { + return locatedBlocks.isUnderConstruction(); + } + /** * Returns the datanode from which the stream is currently reading. */ @@ -878,7 +882,9 @@ public class DFSInputStream extends FSInputStream implements ByteBufferReadable String clientName) throws IOException { - if (dfsClient.shouldTryShortCircuitRead(dnAddr)) { + // Can't local read a block under construction, see HDFS-2757 + if (dfsClient.shouldTryShortCircuitRead(dnAddr) && + !blockUnderConstruction()) { return DFSClient.getLocalBlockReader(dfsClient.conf, src, block, blockToken, chosenNode, dfsClient.hdfsTimeout, startOffset, dfsClient.connectToDnViaHostname());