Skip to content

Commit c56a07f

Browse files
authored
HDFS-16327. Make DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY reconfigurable (#3716)
1 parent a5bcf4c commit c56a07f

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
lines changed

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/blockmanagement/DatanodeManager.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public class DatanodeManager {
214214
private static Set<String> slowNodesUuidSet = Sets.newConcurrentHashSet();
215215
private Daemon slowPeerCollectorDaemon;
216216
private final long slowPeerCollectionInterval;
217-
private final int maxSlowPeerReportNodes;
217+
private volatile int maxSlowPeerReportNodes;
218218

219219
@Nullable
220220
private final SlowDiskTracker slowDiskTracker;
@@ -515,6 +515,15 @@ public boolean getEnableAvoidSlowDataNodesForRead() {
515515
return this.avoidSlowDataNodesForRead;
516516
}
517517

518+
public void setMaxSlowpeerCollectNodes(int maxNodes) {
519+
this.maxSlowPeerReportNodes = maxNodes;
520+
}
521+
522+
@VisibleForTesting
523+
public int getMaxSlowpeerCollectNodes() {
524+
return this.maxSlowPeerReportNodes;
525+
}
526+
518527
/**
519528
* Sort the non-striped located blocks by the distance to the target host.
520529
*

hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NameNode.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@
191191
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_DEFAULT;
192192
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY;
193193
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_DEFAULT;
194+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY;
195+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_DEFAULT;
194196

195197
import static org.apache.hadoop.util.ExitUtil.terminate;
196198
import static org.apache.hadoop.util.ToolRunner.confirmPrompt;
@@ -334,7 +336,8 @@ public enum OperationCategory {
334336
DFS_BLOCK_PLACEMENT_EC_CLASSNAME_KEY,
335337
DFS_IMAGE_PARALLEL_LOAD_KEY,
336338
DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_KEY,
337-
DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY));
339+
DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY,
340+
DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY));
338341

339342
private static final String USAGE = "Usage: hdfs namenode ["
340343
+ StartupOption.BACKUP.getName() + "] | \n\t["
@@ -2204,7 +2207,8 @@ protected String reconfigurePropertyImpl(String property, String newVal)
22042207
} else if (property.equals(DFS_IMAGE_PARALLEL_LOAD_KEY)) {
22052208
return reconfigureParallelLoad(newVal);
22062209
} else if (property.equals(DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_KEY)
2207-
|| (property.equals(DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY))) {
2210+
|| (property.equals(DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY))
2211+
|| (property.equals(DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY))) {
22082212
return reconfigureSlowNodesParameters(datanodeManager, property, newVal);
22092213
} else {
22102214
throw new ReconfigurationException(property, newVal, getConf().get(
@@ -2396,24 +2400,32 @@ String reconfigureSlowNodesParameters(final DatanodeManager datanodeManager,
23962400
final String property, final String newVal) throws ReconfigurationException {
23972401
BlockManager bm = namesystem.getBlockManager();
23982402
namesystem.writeLock();
2399-
boolean enable;
2403+
String result;
24002404
try {
24012405
if (property.equals(DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_KEY)) {
2402-
enable = (newVal == null ? DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_DEFAULT :
2406+
boolean enable = (newVal == null ? DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_DEFAULT :
24032407
Boolean.parseBoolean(newVal));
2408+
result = Boolean.toString(enable);
24042409
datanodeManager.setAvoidSlowDataNodesForReadEnabled(enable);
24052410
} else if (property.equals(
24062411
DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY)) {
2407-
enable = (newVal == null ?
2412+
boolean enable = (newVal == null ?
24082413
DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_DEFAULT :
24092414
Boolean.parseBoolean(newVal));
2415+
result = Boolean.toString(enable);
24102416
bm.setExcludeSlowNodesEnabled(enable);
2417+
} else if (property.equals(DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY)) {
2418+
int maxSlowpeerCollectNodes = (newVal == null ?
2419+
DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_DEFAULT :
2420+
Integer.parseInt(newVal));
2421+
result = Integer.toString(maxSlowpeerCollectNodes);
2422+
datanodeManager.setMaxSlowpeerCollectNodes(maxSlowpeerCollectNodes);
24112423
} else {
24122424
throw new IllegalArgumentException("Unexpected property " +
24132425
property + " in reconfigureSlowNodesParameters");
24142426
}
24152427
LOG.info("RECONFIGURE* changed {} to {}", property, newVal);
2416-
return Boolean.toString(enable);
2428+
return result;
24172429
} catch (IllegalArgumentException e) {
24182430
throw new ReconfigurationException(property, newVal, getConf().get(
24192431
property), e);

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeReconfigure.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_BLOCK_INVALIDATE_LIMIT_KEY;
5656
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_KEY;
5757
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY;
58+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY;
5859
import static org.apache.hadoop.fs.CommonConfigurationKeys.IPC_BACKOFF_ENABLE_DEFAULT;
5960

6061
public class TestNameNodeReconfigure {
@@ -430,6 +431,24 @@ public void testEnableSlowNodesParametersAfterReconfigured()
430431
getExcludeSlowNodesEnabled(BlockType.STRIPED));
431432
}
432433

434+
@Test
435+
public void testReconfigureMaxSlowpeerCollectNodes()
436+
throws ReconfigurationException {
437+
final NameNode nameNode = cluster.getNameNode();
438+
final DatanodeManager datanodeManager = nameNode.namesystem
439+
.getBlockManager().getDatanodeManager();
440+
441+
// By default, DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY is 5.
442+
assertEquals(5, datanodeManager.getMaxSlowpeerCollectNodes());
443+
444+
// Reconfigure.
445+
nameNode.reconfigureProperty(
446+
DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY, Integer.toString(10));
447+
448+
// Assert DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY is 10.
449+
assertEquals(10, datanodeManager.getMaxSlowpeerCollectNodes());
450+
}
451+
433452
@After
434453
public void shutDown() throws IOException {
435454
if (cluster != null) {

hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/tools/TestDFSAdmin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import org.slf4j.Logger;
9191
import org.slf4j.LoggerFactory;
9292

93+
import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY;
9394
import static org.apache.hadoop.hdfs.client.HdfsAdmin.TRASH_PERMISSION;
9495
import static org.hamcrest.CoreMatchers.allOf;
9596
import static org.hamcrest.CoreMatchers.anyOf;
@@ -432,14 +433,15 @@ public void testNameNodeGetReconfigurableProperties() throws IOException {
432433
final List<String> outs = Lists.newArrayList();
433434
final List<String> errs = Lists.newArrayList();
434435
getReconfigurableProperties("namenode", address, outs, errs);
435-
assertEquals(15, outs.size());
436+
assertEquals(16, outs.size());
436437
assertEquals(DFS_BLOCK_PLACEMENT_EC_CLASSNAME_KEY, outs.get(1));
437438
assertEquals(DFS_BLOCK_REPLICATOR_CLASSNAME_KEY, outs.get(2));
438439
assertEquals(DFS_HEARTBEAT_INTERVAL_KEY, outs.get(3));
439440
assertEquals(DFS_IMAGE_PARALLEL_LOAD_KEY, outs.get(4));
440441
assertEquals(DFS_NAMENODE_AVOID_SLOW_DATANODE_FOR_READ_KEY, outs.get(5));
441442
assertEquals(DFS_NAMENODE_BLOCKPLACEMENTPOLICY_EXCLUDE_SLOW_NODES_ENABLED_KEY, outs.get(6));
442443
assertEquals(DFS_NAMENODE_HEARTBEAT_RECHECK_INTERVAL_KEY, outs.get(7));
444+
assertEquals(DFS_NAMENODE_MAX_SLOWPEER_COLLECT_NODES_KEY, outs.get(8));
443445
assertEquals(errs.size(), 0);
444446
}
445447

0 commit comments

Comments
 (0)