diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 4742695fb5..714f3ba840 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -807,6 +807,9 @@ Release 2.5.0 - UNRELEASED HDFS-5411. Update Bookkeeper dependency to 4.2.3. (Rakesh R via umamahesh) + HDFS-6631. TestPread#testHedgedReadLoopTooManyTimes fails intermittently. + (Liang Xie via cnauroth) + BREAKDOWN OF HDFS-2006 SUBTASKS AND RELATED JIRAS HDFS-6299. Protobuf for XAttr and client-side implementation. (Yi Liu via umamahesh) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClientFaultInjector.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClientFaultInjector.java index ebdc98f95f..5392c66827 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClientFaultInjector.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSClientFaultInjector.java @@ -52,4 +52,6 @@ public boolean failPacket() { public void startFetchFromDatanode() {} public void fetchFromDatanodeException() {} + + public void readFromDatanodeDelay() {} } 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 dd8ec1b5c1..53ee4b26c4 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 @@ -1044,6 +1044,7 @@ private void actualGetFromOneDataNode(final DNAddrPair datanode, throw new IOException("truncated return from reader.read(): " + "excpected " + len + ", got " + nread); } + DFSClientFaultInjector.get().readFromDatanodeDelay(); return; } catch (ChecksumException e) { String msg = "fetchBlockByteRange(). Got a checksum exception for " diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestPread.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestPread.java index 209cd7b44c..00a3ebc2af 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestPread.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestPread.java @@ -289,11 +289,12 @@ public void testHedgedReadLoopTooManyTimes() throws IOException { DFSClientFaultInjector.instance = Mockito .mock(DFSClientFaultInjector.class); DFSClientFaultInjector injector = DFSClientFaultInjector.instance; + final int sleepMs = 100; Mockito.doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { if (true) { - Thread.sleep(hedgedReadTimeoutMillis + 1); + Thread.sleep(hedgedReadTimeoutMillis + sleepMs); if (DFSClientFaultInjector.exceptionNum.compareAndSet(0, 1)) { System.out.println("-------------- throw Checksum Exception"); throw new ChecksumException("ChecksumException test", 100); @@ -302,6 +303,15 @@ public Void answer(InvocationOnMock invocation) throws Throwable { return null; } }).when(injector).fetchFromDatanodeException(); + Mockito.doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + if (true) { + Thread.sleep(sleepMs * 2); + } + return null; + } + }).when(injector).readFromDatanodeDelay(); MiniDFSCluster cluster = new MiniDFSCluster.Builder(conf).numDataNodes(2) .format(true).build();