Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,9 @@ public NodeDecommissionManager(OzoneConfiguration config, NodeManager nm, Contai
ScmConfigKeys.OZONE_SCM_DATANODE_ADMIN_MONITOR_INTERVAL_DEFAULT,
TimeUnit.MILLISECONDS);

setMaintenanceConfigs(config.getInt("hdds.scm.replication.maintenance.replica.minimum", 2),
config.getInt("hdds.scm.replication.maintenance.remaining.redundancy", 1));
ReplicationManager.ReplicationManagerConfiguration rmConf = rm.getConfig();
setMaintenanceConfigs(rmConf.getMaintenanceReplicaMinimum(),
rmConf.getMaintenanceRemainingRedundancy());

monitor = new DatanodeAdminMonitorImpl(config, eventQueue, nodeManager,
rm);
Expand Down Expand Up @@ -643,4 +644,14 @@ public void setMaintenanceConfigs(int replicaMinimum, int remainingRedundancy) {
maintenanceReplicaMinimum = replicaMinimum;
}
}

@VisibleForTesting
public synchronized int getMaintenanceReplicaMinimum() {
return maintenanceReplicaMinimum;
}

@VisibleForTesting
public synchronized int getMaintenanceRemainingRedundancy() {
return maintenanceRemainingRedundancy;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ public void setup() throws Exception {
conf = new OzoneConfiguration();
conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, testDir.getAbsolutePath());
replicationManager = mock(ReplicationManager.class);
// This test runs a real SCM, whose startup builds a NodeDecommissionManager that reads
// rm.getConfig(), so the injected mock RM must return a real config, not null.
when(replicationManager.getConfig()).thenReturn(
conf.getObject(ReplicationManager.ReplicationManagerConfiguration.class));
SCMConfigurator configurator = new SCMConfigurator();
configurator.setSCMHAManager(SCMHAManagerStub.getInstance(true));
configurator.setReplicationManager(replicationManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.apache.hadoop.hdds.scm.container.ContainerID;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.container.ContainerManager;
import org.apache.hadoop.hdds.scm.container.replication.ReplicationManager;
import org.apache.hadoop.hdds.scm.ha.SCMContext;
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
Expand Down Expand Up @@ -80,7 +81,7 @@ void setup(@TempDir File dir) throws Exception {
nodeManager = (SCMNodeManager) scm.getScmNodeManager();
containerManager = mock(ContainerManager.class);
decom = new NodeDecommissionManager(conf, nodeManager, containerManager,
SCMContext.emptyContext(), new EventQueue(), null);
SCMContext.emptyContext(), new EventQueue(), mockReplicationManager(conf));
when(containerManager.allocateContainer(any(ReplicationConfig.class), anyString()))
.thenAnswer(invocation -> createMockContainer((ReplicationConfig)invocation.getArguments()[0],
(String) invocation.getArguments()[1]));
Expand Down Expand Up @@ -111,6 +112,13 @@ private ContainerInfo getMockContainer(ReplicationConfig rep, ContainerID conId)
return builder.build();
}

private ReplicationManager mockReplicationManager(OzoneConfiguration config) {
ReplicationManager rm = mock(ReplicationManager.class);
when(rm.getConfig()).thenReturn(
config.getObject(ReplicationManager.ReplicationManagerConfiguration.class));
return rm;
}

@Test
public void testHostStringsParseCorrectly()
throws InvalidHostStringException {
Expand Down Expand Up @@ -612,7 +620,7 @@ public void testInsufficientNodeDecommissionChecksForNNF() throws

nodeManager = mock(SCMNodeManager.class);
decom = new NodeDecommissionManager(conf, nodeManager, containerManager,
SCMContext.emptyContext(), new EventQueue(), null);
SCMContext.emptyContext(), new EventQueue(), mockReplicationManager(conf));
when(containerManager.getContainer(any(ContainerID.class)))
.thenAnswer(invocation -> getMockContainer(RatisReplicationConfig
.getInstance(HddsProtos.ReplicationFactor.THREE), (ContainerID)invocation.getArguments()[0]));
Expand Down Expand Up @@ -970,7 +978,7 @@ public void testInsufficientNodeMaintenanceChecksForNNF() throws

nodeManager = mock(SCMNodeManager.class);
decom = new NodeDecommissionManager(conf, nodeManager, containerManager,
SCMContext.emptyContext(), new EventQueue(), null);
SCMContext.emptyContext(), new EventQueue(), mockReplicationManager(conf));
when(containerManager.getContainer(any(ContainerID.class)))
.thenAnswer(invocation -> getMockContainer(RatisReplicationConfig
.getInstance(HddsProtos.ReplicationFactor.THREE), (ContainerID)invocation.getArguments()[0]));
Expand Down Expand Up @@ -1101,4 +1109,26 @@ private List<DatanodeDetails> generateDatanodes() {

return dns;
}

@Test
public void testMaintenanceConfigsReadFromReplicationManagerConfiguration() {
// NodeDecommissionManager built in setup() uses the ReplicationManagerConfiguration defaults (2, 1).
assertEquals(2, decom.getMaintenanceReplicaMinimum());
assertEquals(1, decom.getMaintenanceRemainingRedundancy());

// Build a ReplicationManagerConfiguration with non-default maintenance values.
ReplicationManager.ReplicationManagerConfiguration rmConf =
new OzoneConfiguration().getObject(ReplicationManager.ReplicationManagerConfiguration.class);
rmConf.setMaintenanceReplicaMinimum(5);
rmConf.setMaintenanceRemainingRedundancy(3);
ReplicationManager rm = mock(ReplicationManager.class);
when(rm.getConfig()).thenReturn(rmConf);

NodeDecommissionManager manager = new NodeDecommissionManager(conf, nodeManager,
containerManager, SCMContext.emptyContext(), new EventQueue(), rm);

// Constructor must read these from ReplicationManagerConfiguration, not hardcoded defaults.
assertEquals(5, manager.getMaintenanceReplicaMinimum());
assertEquals(3, manager.getMaintenanceRemainingRedundancy());
}
}