Selaa lähdekoodia

HDFS-15038. TestFsck testFsckListCorruptSnapshotFiles is failing in trunk. Contributed by hemanthboyina.

Ayush Saxena 5 vuotta sitten
vanhempi
commit
7a87007545

+ 26 - 22
hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFsck.java

@@ -1151,17 +1151,7 @@ public class TestFsck {
       }
       }
     }
     }
 
 
-    // wait for the namenode to see the corruption
-    final NamenodeProtocols namenode = cluster.getNameNodeRpc();
-    CorruptFileBlocks corruptFileBlocks = namenode
-        .listCorruptFileBlocks("/corruptData", null);
-    int numCorrupt = corruptFileBlocks.getFiles().length;
-    while (numCorrupt == 0) {
-      Thread.sleep(1000);
-      corruptFileBlocks = namenode
-          .listCorruptFileBlocks("/corruptData", null);
-      numCorrupt = corruptFileBlocks.getFiles().length;
-    }
+    waitForCorruptionBlocks(3, "/corruptData");
     outStr = runFsck(conf, -1, true, "/corruptData", "-list-corruptfileblocks");
     outStr = runFsck(conf, -1, true, "/corruptData", "-list-corruptfileblocks");
     System.out.println("2. bad fsck out: " + outStr);
     System.out.println("2. bad fsck out: " + outStr);
     assertTrue(outStr.contains("has 3 CORRUPT files"));
     assertTrue(outStr.contains("has 3 CORRUPT files"));
@@ -2148,17 +2138,7 @@ public class TestFsck {
     hdfs.delete(fp, false);
     hdfs.delete(fp, false);
     numFiles--;
     numFiles--;
 
 
-    // wait for the namenode to see the corruption
-    final NamenodeProtocols namenode = cluster.getNameNodeRpc();
-    CorruptFileBlocks corruptFileBlocks = namenode
-        .listCorruptFileBlocks("/corruptData", null);
-    int numCorrupt = corruptFileBlocks.getFiles().length;
-    while (numCorrupt == 0) {
-      Thread.sleep(1000);
-      corruptFileBlocks = namenode
-          .listCorruptFileBlocks("/corruptData", null);
-      numCorrupt = corruptFileBlocks.getFiles().length;
-    }
+    waitForCorruptionBlocks(numSnapshots, "/corruptData");
 
 
     // with -includeSnapshots all files are reported
     // with -includeSnapshots all files are reported
     outStr = runFsck(conf, -1, true, "/corruptData",
     outStr = runFsck(conf, -1, true, "/corruptData",
@@ -2176,6 +2156,30 @@ public class TestFsck {
     assertFalse(outStr.contains("/.snapshot/"));
     assertFalse(outStr.contains("/.snapshot/"));
   }
   }
 
 
+  /**
+   * Wait for the namenode to see the corruption.
+   * @param corruptBlocks The expected number of corruptfilelocks
+   * @param path The Directory Path where corruptfileblocks exists
+   * @throws IOException
+   */
+  private void waitForCorruptionBlocks(int corruptBlocks, String path)
+      throws Exception {
+    GenericTestUtils.waitFor(() -> {
+      try {
+        final NamenodeProtocols namenode = cluster.getNameNodeRpc();
+        CorruptFileBlocks corruptFileBlocks =
+            namenode.listCorruptFileBlocks(path, null);
+        int numCorrupt = corruptFileBlocks.getFiles().length;
+        if (numCorrupt == corruptBlocks) {
+          return true;
+        }
+      } catch (Exception e) {
+        LOG.error("Exception while getting Corrupt file blocks", e);
+      }
+      return false;
+    }, 100, 10000);
+  }
+
   @Test (timeout = 300000)
   @Test (timeout = 300000)
   public void testFsckMoveAfterCorruption() throws Exception {
   public void testFsckMoveAfterCorruption() throws Exception {
     final int dfsBlockSize = 512 * 1024;
     final int dfsBlockSize = 512 * 1024;