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 7998fd7f098..768959320e4 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 @@ -211,7 +211,7 @@ class BlockManagerSafeMode { switch (status) { case PENDING_THRESHOLD: if (areThresholdsMet()) { - if (extension > 0) { + if (blockTotal > 0 && extension > 0) { // PENDING_THRESHOLD -> EXTENSION status = BMSafeModeStatus.EXTENSION; reachedTime.set(monotonicNow()); @@ -533,11 +533,13 @@ class BlockManagerSafeMode { /** * 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 5317d679109..b246b1d9356 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 class TestBlockManagerSafeMode { }, 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 ef0a4f28166..4e0c753b811 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 @@ -493,7 +493,15 @@ public class TestHASafeMode { 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