diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java index 79adf009f003..4f0846234225 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestSCMSafeModeManager.java @@ -25,10 +25,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.client.RatisReplicationConfig; @@ -135,6 +138,7 @@ private void testSafeMode(int numContainers) throws Exception { serviceManager, scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); + validateRuleStatus("DatanodeSafeModeRule", "registered datanodes 0"); queue.fireEvent(SCMEvents.NODE_REGISTRATION_CONT_REPORT, HddsTestUtils.createNodeRegistrationContainerReport(containers)); @@ -176,7 +180,8 @@ public void testSafeModeExitRule() throws Exception { .getNumContainerWithOneReplicaReportedThreshold().value()); assertTrue(scmSafeModeManager.getInSafeMode()); - + validateRuleStatus("ContainerSafeModeRule", + "% of containers with at least one reported"); testContainerThreshold(containers.subList(0, 25), 0.25); assertEquals(25, scmSafeModeManager.getSafeModeMetrics() .getCurrentContainersWithOneReplicaReportedCount().value()); @@ -316,6 +321,13 @@ public void testSafeModeExitRuleWithPipelineAvailabilityCheck( scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); + if (healthyPipelinePercent > 0) { + validateRuleStatus("HealthyPipelineSafeModeRule", + "healthy Ratis/THREE pipelines"); + } + validateRuleStatus("OneReplicaPipelineSafeModeRule", + "reported Ratis/THREE pipelines with at least one datanode"); + testContainerThreshold(containers, 1.0); List pipelines = pipelineManager.getPipelines(); @@ -374,6 +386,22 @@ public void testSafeModeExitRuleWithPipelineAvailabilityCheck( 100, 1000 * 5); } + /** + * @param safeModeRule verify that this rule is not satisfied + * @param stringToMatch string to match in the rule status. + */ + private void validateRuleStatus(String safeModeRule, String stringToMatch) { + Set>> ruleStatuses = + scmSafeModeManager.getRuleStatus().entrySet(); + for (Map.Entry> entry : ruleStatuses) { + if (entry.getKey().equals(safeModeRule)) { + Pair value = entry.getValue(); + assertEquals(false, value.getLeft()); + assertTrue(value.getRight().contains(stringToMatch)); + } + } + } + private void checkHealthy(int expectedCount) throws Exception { GenericTestUtils.waitFor(() -> scmSafeModeManager .getHealthyPipelineSafeModeRule()