From 1032104b9ac473b25d3ed7cc53dca7a8530d79e1 Mon Sep 17 00:00:00 2001 From: jianghuazhu <740087514@qq.com> Date: Tue, 14 Sep 2021 16:54:36 +0800 Subject: [PATCH] HDFS-15920.Solve the problem that the value of SafeModeMonitor#RECHECK_INTERVAL can be configured. (#2831). Contributed by JiangHua Zhu. Signed-off-by: Ayush Saxena --- .../org/apache/hadoop/hdfs/DFSConfigKeys.java | 4 ++++ .../blockmanagement/BlockManagerSafeMode.java | 22 +++++++++++++++---- .../src/main/resources/hdfs-default.xml | 8 +++++++ .../TestBlockManagerSafeMode.java | 12 ++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java index f6c54dd0430..942929ac285 100755 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSConfigKeys.java @@ -207,6 +207,10 @@ public class DFSConfigKeys extends CommonConfigurationKeys { "dfs.namenode.replqueue.threshold-pct"; public static final String DFS_NAMENODE_SAFEMODE_MIN_DATANODES_KEY = "dfs.namenode.safemode.min.datanodes"; public static final int DFS_NAMENODE_SAFEMODE_MIN_DATANODES_DEFAULT = 0; + public static final String DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_KEY = + "dfs.namenode.safemode.recheck.interval"; + public static final long DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_DEFAULT = + 1000; public static final String DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY = HdfsClientConfigKeys.DeprecatedKeys.DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_KEY; public static final String DFS_NAMENODE_SECONDARY_HTTP_ADDRESS_DEFAULT = 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 d731143b172..0bc6613a4e2 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 @@ -109,7 +109,7 @@ enum BMSafeModeStatus { /** Timestamp of the safe mode initialized. */ private long startTime; /** the safe mode monitor thread. */ - private final Daemon smmthread = new Daemon(new SafeModeMonitor()); + private final Daemon smmthread; /** time of the last status printout */ private long lastStatusReport; @@ -156,6 +156,7 @@ enum BMSafeModeStatus { MILLISECONDS); this.inRollBack = isInRollBackMode(NameNode.getStartupOption(conf)); + this.smmthread = new Daemon(new SafeModeMonitor(conf)); LOG.info("{} = {}", DFS_NAMENODE_SAFEMODE_THRESHOLD_PCT_KEY, threshold); LOG.info("{} = {}", DFS_NAMENODE_SAFEMODE_MIN_DATANODES_KEY, @@ -638,9 +639,22 @@ private void reportStatus(String msg, boolean rightNow) { * Periodically check whether it is time to leave safe mode. * This thread starts when the threshold level is reached. */ - private class SafeModeMonitor implements Runnable { + final private class SafeModeMonitor implements Runnable { /** Interval in msec for checking safe mode. */ - private static final long RECHECK_INTERVAL = 1000; + private long recheckInterval; + + private SafeModeMonitor(Configuration conf) { + recheckInterval = conf.getLong( + DFSConfigKeys.DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_KEY, + DFSConfigKeys.DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_DEFAULT); + if (recheckInterval < 1) { + LOG.warn("Invalid value for " + + DFSConfigKeys.DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_DEFAULT + + ".Should be greater than 0, but is {}", recheckInterval); + recheckInterval = DFSConfigKeys.DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_DEFAULT; + } + LOG.info("Using {} as SafeModeMonitor Interval", recheckInterval); + } @Override public void run() { @@ -660,7 +674,7 @@ public void run() { } try { - Thread.sleep(RECHECK_INTERVAL); + Thread.sleep(recheckInterval); } catch (InterruptedException ignored) { } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml index 7b580d2e34a..16eddff2a0f 100755 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/resources/hdfs-default.xml @@ -1011,6 +1011,14 @@ + + dfs.namenode.safemode.recheck.interval + 1000 + + Interval in msec for checking safe mode. + + + dfs.namenode.safemode.extension 30000 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 5d2a07ed5de..291b7c62b8e 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 @@ -230,6 +230,18 @@ public void testCheckSafeMode8() throws Exception { assertEquals(BMSafeModeStatus.OFF, getSafeModeStatus()); } + @Test(timeout = 20000) + public void testCheckSafeMode9() throws Exception { + Configuration conf = new HdfsConfiguration(); + conf.setLong(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_RECHECK_INTERVAL_KEY, 3000); + GenericTestUtils.LogCapturer logs = + GenericTestUtils.LogCapturer.captureLogs(BlockManagerSafeMode.LOG); + BlockManagerSafeMode blockManagerSafeMode = new BlockManagerSafeMode(bm, + fsn, true, conf); + String content = logs.getOutput(); + assertTrue(content.contains("Using 3000 as SafeModeMonitor Interval")); + } + /** * Test that the block safe increases up to block threshold. *