Repository: hadoop Updated Branches: refs/heads/branch-2 bcfa6d538 -> 57a0f8486
HDFS-11105. TestRBWBlockInvalidation#testRWRInvalidation fails intermittently. Contributed by Yiqun Lin (cherry picked from commit c90891e7b3afaa66dbca967b83a9997e80e893d8) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/57a0f848 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/57a0f848 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/57a0f848 Branch: refs/heads/branch-2 Commit: 57a0f84860c400a693efad62ed9c76de59cf55c3 Parents: bcfa6d5 Author: Mingliang Liu <[email protected]> Authored: Wed Nov 16 13:02:10 2016 -0800 Committer: Mingliang Liu <[email protected]> Committed: Wed Nov 16 13:06:25 2016 -0800 ---------------------------------------------------------------------- .../TestRBWBlockInvalidation.java | 45 +++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/57a0f848/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestRBWBlockInvalidation.java ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestRBWBlockInvalidation.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestRBWBlockInvalidation.java index 744e9fa..7db7f0d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestRBWBlockInvalidation.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestRBWBlockInvalidation.java @@ -42,8 +42,10 @@ import org.apache.hadoop.hdfs.server.namenode.FSNamesystem; import org.apache.hadoop.hdfs.server.namenode.ha.HATestUtil; import org.apache.hadoop.hdfs.server.namenode.ha.TestDNFencing.RandomDeleterPolicy; import org.apache.hadoop.io.IOUtils; +import org.apache.hadoop.test.GenericTestUtils; import org.junit.Test; +import com.google.common.base.Supplier; import com.google.common.collect.Lists; /** @@ -142,7 +144,7 @@ public class TestRBWBlockInvalidation { * were RWR replicas with out-of-date genstamps, the NN could accidentally * delete good replicas instead of the bad replicas. */ - @Test(timeout=60000) + @Test(timeout=120000) public void testRWRInvalidation() throws Exception { Configuration conf = new HdfsConfiguration(); @@ -157,10 +159,11 @@ public class TestRBWBlockInvalidation { // Speed up the test a bit with faster heartbeats. conf.setInt(DFSConfigKeys.DFS_HEARTBEAT_INTERVAL_KEY, 1); + int numFiles = 10; // Test with a bunch of separate files, since otherwise the test may // fail just due to "good luck", even if a bug is present. List<Path> testPaths = Lists.newArrayList(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < numFiles; i++) { testPaths.add(new Path("/test" + i)); } @@ -177,8 +180,11 @@ public class TestRBWBlockInvalidation { out.writeBytes("old gs data\n"); out.hflush(); } - - + + for (Path path : testPaths) { + DFSTestUtil.waitReplication(cluster.getFileSystem(), path, (short)2); + } + // Shutdown one of the nodes in the pipeline DataNodeProperties oldGenstampNode = cluster.stopDataNode(0); @@ -196,7 +202,11 @@ public class TestRBWBlockInvalidation { cluster.getFileSystem().setReplication(path, (short)1); out.close(); } - + + for (Path path : testPaths) { + DFSTestUtil.waitReplication(cluster.getFileSystem(), path, (short)1); + } + // Upon restart, there will be two replicas, one with an old genstamp // and one current copy. This test wants to ensure that the old genstamp // copy is the one that is deleted. @@ -219,7 +229,8 @@ public class TestRBWBlockInvalidation { cluster.triggerHeartbeats(); HATestUtil.waitForDNDeletions(cluster); cluster.triggerDeletionReports(); - + + waitForNumTotalBlocks(cluster, numFiles); // Make sure we can still read the blocks. for (Path path : testPaths) { String ret = DFSTestUtil.readFile(cluster.getFileSystem(), path); @@ -233,4 +244,26 @@ public class TestRBWBlockInvalidation { } } + + private void waitForNumTotalBlocks(final MiniDFSCluster cluster, + final int numTotalBlocks) throws Exception { + GenericTestUtils.waitFor(new Supplier<Boolean>() { + + @Override + public Boolean get() { + try { + cluster.triggerBlockReports(); + + // Wait total blocks + if (cluster.getNamesystem().getBlocksTotal() == numTotalBlocks) { + return true; + } + } catch (Exception ignored) { + // Ignore the exception + } + + return false; + } + }, 1000, 60000); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
