diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManagerSafeMode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManagerSafeMode.java index 501f607620..aecdb59df0 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManagerSafeMode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/BlockManagerSafeMode.java @@ -210,7 +210,7 @@ void checkSafeMode() { switch (status) { case PENDING_THRESHOLD: if (areThresholdsMet()) { - if (extension > 0) { + if (blockTotal > 0 && extension > 0) { // PENDING_THRESHOLD -> EXTENSION status = BMSafeModeStatus.EXTENSION; reachedTime.set(monotonicNow()); @@ -532,11 +532,13 @@ void close() { /** * Get time (counting in milliseconds) left to leave extension period. + * It should leave safemode at once if blockTotal = 0 rather than wait + * extension time (30s by default). * * Negative value indicates the extension period has passed. */ private long timeToLeaveExtension() { - return reachedTime.get() + extension - monotonicNow(); + return blockTotal > 0 ? reachedTime.get() + extension - monotonicNow() : 0; } /** diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockManagerSafeMode.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockManagerSafeMode.java index 1736f90c60..964efb1634 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockManagerSafeMode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/blockmanagement/TestBlockManagerSafeMode.java @@ -221,6 +221,15 @@ public Boolean get() { }, 100, 10000); } + @Test + public void testCheckSafeMode8() throws Exception { + bmSafeMode.activate(0); + setBlockSafe(0); + setSafeModeStatus(BMSafeModeStatus.PENDING_THRESHOLD); + bmSafeMode.checkSafeMode(); + assertEquals(BMSafeModeStatus.OFF, getSafeModeStatus()); + } + /** * Test that the block safe increases up to block threshold. * diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java index 4647dd78d9..8de09cf6a9 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java @@ -497,7 +497,15 @@ public void testBlocksDeletedInEditLog() throws Exception { private static void assertSafeMode(NameNode nn, int safe, int total, int numNodes, int nodeThresh) { String status = nn.getNamesystem().getSafemode(); - if (safe == total) { + if (total == 0 && nodeThresh == 0) { + assertTrue("Bad safemode status: '" + status + "'", + status.isEmpty() + || status.startsWith("Safe mode is ON. The reported blocks 0 " + + "has reached the threshold 0.9990 of total blocks 0. The " + + "minimum number of live datanodes is not required. In safe " + + "mode extension. Safe mode will be turned off automatically " + + "in 0 seconds.")); + } else if (safe == total) { if (nodeThresh == 0) { assertTrue("Bad safemode status: '" + status + "'", status.startsWith("Safe mode is ON. The reported blocks " + safe