diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java index 6b6a888f4241..2ddcb223bf93 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManager.java @@ -24,6 +24,7 @@ import java.util.Set; import org.apache.hadoop.hdds.client.ReplicationConfig; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleEvent; import org.apache.hadoop.hdds.scm.pipeline.Pipeline; @@ -72,6 +73,8 @@ default List getContainers() { List getContainers(ContainerID startID, int count); + List getContainers(ReplicationType type); + /** * Returns all the containers which are in the specified state. * diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java index d61f9ee366bd..113903e647b4 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java @@ -37,6 +37,7 @@ import org.apache.hadoop.hdds.client.ECReplicationConfig; import org.apache.hadoop.hdds.client.ReplicationConfig; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ContainerInfoProto; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleEvent; @@ -147,6 +148,12 @@ public ContainerInfo getContainer(final ContainerID id) id + " not found.")); } + + @Override + public List getContainers(ReplicationType type) { + return toContainers(containerStateManager.getContainerIDs(type)); + } + @Override public List getContainers(final ContainerID startID, final int count) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java index 4f478b201cd4..263dc14469a2 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java @@ -23,6 +23,7 @@ import java.util.Set; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ContainerInfoProto; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.scm.metadata.Replicate; @@ -114,6 +115,12 @@ public interface ContainerStateManager { */ Set getContainerIDs(LifeCycleState state); + + /** + * Returns the IDs of the Containers whose ReplicationType matches the given type. + */ + Set getContainerIDs(ReplicationType type); + /** * */ diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java index 28a732795b17..f2cbe451ba73 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java @@ -34,6 +34,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.StorageUnit; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ContainerInfoProto; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleEvent; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; @@ -287,6 +288,13 @@ public Set getContainerIDs(final LifeCycleState state) { } } + @Override + public Set getContainerIDs(final ReplicationType type) { + try (AutoCloseableLock ignored = readLock()) { + return containers.getContainerIDsByType(type); + } + } + @Override public ContainerInfo getContainer(final ContainerID id) { try (AutoCloseableLock ignored = readLock(id)) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java index 438e9709bffd..4e6f0ed67ce8 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/states/ContainerStateMap.java @@ -316,7 +316,7 @@ NavigableSet getContainerIDsByOwner(final String ownerName) { * @param type - Replication type -- StandAlone, Ratis etc. * @return NavigableSet */ - NavigableSet getContainerIDsByType(final ReplicationType type) { + public NavigableSet getContainerIDsByType(final ReplicationType type) { Preconditions.checkNotNull(type); return typeMap.getCollection(type); } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/ContainerSafeModeRule.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/ContainerSafeModeRule.java index bdd7160de4c5..b66b6e9f0f6e 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/ContainerSafeModeRule.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/ContainerSafeModeRule.java @@ -1,4 +1,4 @@ -/** +/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -27,11 +27,11 @@ import java.util.stream.Collectors; import com.google.common.collect.Sets; -import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.client.ReplicationConfig; import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; +import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos; import org.apache.hadoop.hdds.scm.container.ContainerID; @@ -48,55 +48,53 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SCM_SAFEMODE_THRESHOLD_PCT; +import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_SCM_SAFEMODE_THRESHOLD_PCT_DEFAULT; + /** * Class defining Safe mode exit criteria for Containers. */ public class ContainerSafeModeRule extends SafeModeExitRule { - public static final Logger LOG = - LoggerFactory.getLogger(ContainerSafeModeRule.class); + public static final Logger LOG = LoggerFactory.getLogger(ContainerSafeModeRule.class); + private final ContainerManager containerManager; // Required cutoff % for containers with at least 1 reported replica. - private double safeModeCutoff; + private final double safeModeCutoff; // Containers read from scm db (excluding containers in ALLOCATED state). - private Set ratisContainers; - private Set ecContainers; - private Map> ecContainerDNsMap; + private final Set ratisContainers; + private final Set ecContainers; + private final Map> ecContainerDNsMap; + private final AtomicLong ratisContainerWithMinReplicas = new AtomicLong(0); + private final AtomicLong ecContainerWithMinReplicas = new AtomicLong(0); + private double ratisMaxContainer; private double ecMaxContainer; - private AtomicLong ratisContainerWithMinReplicas = new AtomicLong(0); - private AtomicLong ecContainerWithMinReplicas = new AtomicLong(0); - private final ContainerManager containerManager; - - public ContainerSafeModeRule(String ruleName, EventQueue eventQueue, - ConfigurationSource conf, - ContainerManager containerManager, SCMSafeModeManager manager) { - this(ruleName, eventQueue, conf, containerManager.getContainers(), containerManager, manager); - } - public ContainerSafeModeRule(String ruleName, EventQueue eventQueue, - ConfigurationSource conf, - List containers, - ContainerManager containerManager, SCMSafeModeManager manager) { + public ContainerSafeModeRule(final String ruleName, + final EventQueue eventQueue, + final ConfigurationSource conf, + final ContainerManager containerManager, + final SCMSafeModeManager manager) { super(manager, ruleName, eventQueue); + this.safeModeCutoff = getSafeModeCutoff(conf); this.containerManager = containerManager; - safeModeCutoff = conf.getDouble( - HddsConfigKeys.HDDS_SCM_SAFEMODE_THRESHOLD_PCT, - HddsConfigKeys.HDDS_SCM_SAFEMODE_THRESHOLD_PCT_DEFAULT); - - Preconditions.checkArgument( - (safeModeCutoff >= 0.0 && safeModeCutoff <= 1.0), - HddsConfigKeys.HDDS_SCM_SAFEMODE_THRESHOLD_PCT + - " value should be >= 0.0 and <= 1.0"); + this.ratisContainers = new HashSet<>(); + this.ecContainers = new HashSet<>(); + this.ecContainerDNsMap = new ConcurrentHashMap<>(); + initializeRule(); + } - ratisContainers = new HashSet<>(); - ecContainers = new HashSet<>(); - ecContainerDNsMap = new ConcurrentHashMap<>(); - initializeRule(containers); + private static double getSafeModeCutoff(ConfigurationSource conf) { + final double cutoff = conf.getDouble(HDDS_SCM_SAFEMODE_THRESHOLD_PCT, + HDDS_SCM_SAFEMODE_THRESHOLD_PCT_DEFAULT); + Preconditions.checkArgument((cutoff >= 0.0 && cutoff <= 1.0), + HDDS_SCM_SAFEMODE_THRESHOLD_PCT + + " value should be >= 0.0 and <= 1.0"); + return cutoff; } - @Override protected TypedEvent getEventType() { return SCMEvents.CONTAINER_REGISTRATION_REPORT; @@ -104,45 +102,59 @@ protected TypedEvent getEventType() { @Override protected synchronized boolean validate() { - return (getCurrentContainerThreshold() >= safeModeCutoff) && - (getCurrentECContainerThreshold() >= safeModeCutoff); + if (validateBasedOnReportProcessing()) { + return (getCurrentContainerThreshold() >= safeModeCutoff) && + (getCurrentECContainerThreshold() >= safeModeCutoff); + } + + // TODO: Split ContainerSafeModeRule into RatisContainerSafeModeRule and + // ECContainerSafeModeRule + final List containers = containerManager.getContainers( + ReplicationType.RATIS); + + return containers.stream() + .filter(this::isClosed) + .map(ContainerInfo::containerID) + .noneMatch(this::isMissing); } - @VisibleForTesting - public synchronized double getCurrentContainerThreshold() { - if (ratisMaxContainer == 0) { - return 1; + /** + * Checks if the container has any replica. + */ + private boolean isMissing(ContainerID id) { + try { + return containerManager.getContainerReplicas(id).isEmpty(); + } catch (ContainerNotFoundException ex) { + /* + * This should never happen, in case this happens the container + * somehow got removed from SCM. + * Safemode rule doesn't have to log/fix this. We will just exclude this + * from the rule validation. + */ + return false; + } - return (ratisContainerWithMinReplicas.doubleValue() / ratisMaxContainer); } @VisibleForTesting - public synchronized double getCurrentECContainerThreshold() { - if (ecMaxContainer == 0) { - return 1; - } - return (ecContainerWithMinReplicas.doubleValue() / ecMaxContainer); + public double getCurrentContainerThreshold() { + return ratisMaxContainer == 0 ? 1 : + (ratisContainerWithMinReplicas.doubleValue() / ratisMaxContainer); } - private synchronized double getEcMaxContainer() { - if (ecMaxContainer == 0) { - return 1; - } - return ecMaxContainer; + @VisibleForTesting + public double getCurrentECContainerThreshold() { + return ecMaxContainer == 0 ? 1 : + (ecContainerWithMinReplicas.doubleValue() / ecMaxContainer); } - private synchronized double getRatisMaxContainer() { - if (ratisMaxContainer == 0) { - return 1; - } - return ratisMaxContainer; - } + // TODO: Report processing logic will be removed in future. HDDS-11958. @Override protected synchronized void process( - NodeRegistrationContainerReport reportsProto) { - DatanodeDetails datanodeDetails = reportsProto.getDatanodeDetails(); - UUID datanodeUUID = datanodeDetails.getUuid(); + final NodeRegistrationContainerReport reportsProto) { + final DatanodeDetails datanodeDetails = reportsProto.getDatanodeDetails(); + final UUID datanodeUUID = datanodeDetails.getUuid(); StorageContainerDatanodeProtocolProtos.ContainerReportsProto report = reportsProto.getReport(); report.getReportsList().forEach(c -> { @@ -166,9 +178,7 @@ protected synchronized void process( SCMSafeModeManager.getLogger().info( "SCM in safe mode. {} % containers [Ratis] have at least one" + " reported replica, {} % containers [EC] have at N reported replica.", - ((ratisContainerWithMinReplicas.doubleValue() / getRatisMaxContainer()) * 100), - ((ecContainerWithMinReplicas.doubleValue() / getEcMaxContainer()) * 100) - ); + getCurrentContainerThreshold() * 100, getCurrentECContainerThreshold() * 100); } } @@ -246,8 +256,8 @@ public String getStatusText() { String status = String.format( "%1.2f%% of [Ratis] Containers(%s / %s) with at least one reported replica (=%1.2f) >= " + "safeModeCutoff (=%1.2f);", - (ratisContainerWithMinReplicas.doubleValue() / getRatisMaxContainer()) * 100, - ratisContainerWithMinReplicas, (long) getRatisMaxContainer(), + getCurrentContainerThreshold() * 100, + ratisContainerWithMinReplicas, (long) ratisMaxContainer, getCurrentContainerThreshold(), this.safeModeCutoff); Set sampleRatisContainers = ratisContainers.stream(). @@ -264,8 +274,8 @@ public String getStatusText() { String ecStatus = String.format( "%1.2f%% of [EC] Containers(%s / %s) with at least N reported replica (=%1.2f) >= " + "safeModeCutoff (=%1.2f);", - (ecContainerWithMinReplicas.doubleValue() / getEcMaxContainer()) * 100, - ecContainerWithMinReplicas, (long) getEcMaxContainer(), + getCurrentECContainerThreshold() * 100, + ecContainerWithMinReplicas, (long) ecMaxContainer, getCurrentECContainerThreshold(), this.safeModeCutoff); status = status.concat("\n").concat(ecStatus); @@ -295,25 +305,19 @@ public String getStatusText() { @Override public synchronized void refresh(boolean forceRefresh) { - List containers = containerManager.getContainers(); - if (forceRefresh) { - initializeRule(containers); - } else { - if (!validate()) { - initializeRule(containers); - } + if (forceRefresh || !validate()) { + initializeRule(); } } - private boolean checkContainerState(LifeCycleState state) { - if (state == LifeCycleState.QUASI_CLOSED || state == LifeCycleState.CLOSED) { - return true; - } - return false; + private boolean isClosed(ContainerInfo container) { + final LifeCycleState state = container.getState(); + return state == LifeCycleState.QUASI_CLOSED || + state == LifeCycleState.CLOSED; } - private void initializeRule(List containers) { - + private void initializeRule() { + final List containers = containerManager.getContainers(); // Clean up the related data in the map. ratisContainers.clear(); ecContainers.clear(); @@ -325,10 +329,9 @@ private void initializeRule(List containers) { // created by the client. We are not considering these containers for // now. These containers can be handled by tracking pipelines. - LifeCycleState containerState = container.getState(); HddsProtos.ReplicationType replicationType = container.getReplicationType(); - if (checkContainerState(containerState) && container.getNumberOfKeys() > 0) { + if (isClosed(container) && container.getNumberOfKeys() > 0) { // If it's of type Ratis if (replicationType.equals(HddsProtos.ReplicationType.RATIS)) { ratisContainers.add(container.getContainerID()); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SCMSafeModeManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SCMSafeModeManager.java index 78ce994af73d..f4e6f6ee2cf9 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SCMSafeModeManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SCMSafeModeManager.java @@ -19,7 +19,6 @@ import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -28,7 +27,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.conf.ConfigurationSource; -import org.apache.hadoop.hdds.scm.container.ContainerInfo; import org.apache.hadoop.hdds.scm.container.ContainerManager; import org.apache.hadoop.hdds.scm.events.SCMEvents; import org.apache.hadoop.hdds.scm.ha.SCMContext; @@ -105,7 +103,6 @@ public class SCMSafeModeManager implements SafeModeManager { private Set validatedPreCheckRules = new HashSet<>(1); private final EventQueue eventPublisher; - private final PipelineManager pipelineManager; private final SCMServiceManager serviceManager; private final SCMContext scmContext; @@ -114,12 +111,10 @@ public class SCMSafeModeManager implements SafeModeManager { // TODO: Remove allContainers argument. (HDDS-11795) public SCMSafeModeManager(ConfigurationSource conf, - List allContainers, ContainerManager containerManager, PipelineManager pipelineManager, EventQueue eventQueue, SCMServiceManager serviceManager, SCMContext scmContext) { this.config = conf; - this.pipelineManager = pipelineManager; this.eventPublisher = eventQueue; this.serviceManager = serviceManager; this.scmContext = scmContext; diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModeExitRule.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModeExitRule.java index 69c1a86ac370..746e825f34b1 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModeExitRule.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/SafeModeExitRule.java @@ -41,6 +41,10 @@ public abstract class SafeModeExitRule implements EventHandler { protected static final int SAMPLE_CONTAINER_DISPLAY_LIMIT = 5; protected static final int SAMPLE_PIPELINE_DISPLAY_LIMIT = 5; + // TODO: Report processing logic will be removed in future. HDDS-11958. + // This flag is to add new code without breaking Safemode logic until we have HDDS-11958. + private boolean validateBasedOnReportProcessing = true; + public SafeModeExitRule(SCMSafeModeManager safeModeManager, String ruleName, EventQueue eventQueue) { this.safeModeManager = safeModeManager; @@ -48,6 +52,14 @@ public SafeModeExitRule(SCMSafeModeManager safeModeManager, eventQueue.addHandler(getEventType(), this); } + public void setValidateBasedOnReportProcessing(boolean newValue) { + validateBasedOnReportProcessing = newValue; + } + + protected boolean validateBasedOnReportProcessing() { + return validateBasedOnReportProcessing; + } + /** * Return's the name of this SafeModeExit Rule. * @return ruleName diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java index 9da0c686c3b7..ae6ba2b4090c 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java @@ -847,8 +847,8 @@ private void initializeSystemManagers(OzoneConfiguration conf, scmSafeModeManager = configurator.getScmSafeModeManager(); } else { scmSafeModeManager = new SCMSafeModeManager(conf, - containerManager.getContainers(), containerManager, - pipelineManager, eventQueue, serviceManager, scmContext); + containerManager, pipelineManager, eventQueue, + serviceManager, scmContext); } scmDecommissionManager = new NodeDecommissionManager(conf, scmNodeManager, containerManager, diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java index 621c9297e7e5..528891623dfd 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/block/TestBlockManager.java @@ -162,8 +162,7 @@ void setUp(@TempDir File tempDir) throws Exception { new ContainerReplicaPendingOps( Clock.system(ZoneId.systemDefault()))); SCMSafeModeManager safeModeManager = new SCMSafeModeManager(conf, - containerManager.getContainers(), containerManager, - pipelineManager, eventQueue, serviceManager, scmContext) { + containerManager, pipelineManager, eventQueue, serviceManager, scmContext) { @Override public void emitSafeModeStatus() { // skip diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java index 1dfbfd327859..900b09c0146f 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineManagerImpl.java @@ -358,7 +358,7 @@ public void testClosePipelineShouldFailOnFollower() throws Exception { public void testPipelineReport() throws Exception { try (PipelineManagerImpl pipelineManager = createPipelineManager(true)) { SCMSafeModeManager scmSafeModeManager = - new SCMSafeModeManager(conf, new ArrayList<>(), + new SCMSafeModeManager(conf, mock(ContainerManager.class), pipelineManager, new EventQueue(), serviceManager, scmContext); Pipeline pipeline = pipelineManager @@ -469,7 +469,7 @@ public void testPipelineOpenOnlyWhenLeaderReported() throws Exception { pipelineManager.getPipeline(pipeline.getId()).getPipelineState()); SCMSafeModeManager scmSafeModeManager = - new SCMSafeModeManager(new OzoneConfiguration(), new ArrayList<>(), + new SCMSafeModeManager(new OzoneConfiguration(), mock(ContainerManager.class), pipelineManager, new EventQueue(), serviceManager, scmContext); PipelineReportHandler pipelineReportHandler = diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java index 13eb4be724c8..b2b3530c1e71 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestHealthyPipelineSafeModeRule.java @@ -99,7 +99,7 @@ public void testHealthyPipelineSafeModeRuleWithNoPipelines() pipelineManager.setPipelineProvider(HddsProtos.ReplicationType.RATIS, mockRatisProvider); SCMSafeModeManager scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, eventQueue, + config, containerManager, pipelineManager, eventQueue, serviceManager, scmContext); HealthyPipelineSafeModeRule healthyPipelineSafeModeRule = @@ -179,7 +179,7 @@ public void testHealthyPipelineSafeModeRuleWithPipelines() throws Exception { MockRatisPipelineProvider.markPipelineHealthy(pipeline3); SCMSafeModeManager scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, eventQueue, + config, containerManager, pipelineManager, eventQueue, serviceManager, scmContext); HealthyPipelineSafeModeRule healthyPipelineSafeModeRule = @@ -275,7 +275,7 @@ public void testHealthyPipelineSafeModeRuleWithMixedPipelines() MockRatisPipelineProvider.markPipelineHealthy(pipeline3); SCMSafeModeManager scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, eventQueue, + config, containerManager, pipelineManager, eventQueue, serviceManager, scmContext); HealthyPipelineSafeModeRule healthyPipelineSafeModeRule = diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java index 76bafa8b1fb3..44594740210f 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/TestOneReplicaPipelineSafeModeRule.java @@ -120,7 +120,7 @@ private void setup(int nodes, int pipelineFactorThreeCount, HddsProtos.ReplicationFactor.ONE); SCMSafeModeManager scmSafeModeManager = - new SCMSafeModeManager(ozoneConfiguration, containers, containerManager, + new SCMSafeModeManager(ozoneConfiguration, containerManager, pipelineManager, eventQueue, serviceManager, scmContext); rule = scmSafeModeManager.getOneReplicaPipelineSafeModeRule(); 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 fc8ec9c19129..1d9a41b683f0 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 @@ -136,7 +136,7 @@ private void testSafeMode(int numContainers) throws Exception { ContainerManager containerManager = mock(ContainerManager.class); when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, null, queue, + config, containerManager, null, queue, serviceManager, scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); @@ -175,7 +175,7 @@ public void testSafeModeExitRule() throws Exception { ContainerManager containerManager = mock(ContainerManager.class); when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, null, queue, + config, containerManager, null, queue, serviceManager, scmContext); long cutOff = (long) Math.ceil(numContainers * config.getDouble( @@ -244,7 +244,7 @@ public void testHealthyPipelinePercentWithIncorrectValue(double healthyPercent, ContainerManager containerManager = mock(ContainerManager.class); when(containerManager.getContainers()).thenReturn(containers); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, - () -> new SCMSafeModeManager(conf, containers, containerManager, + () -> new SCMSafeModeManager(conf, containerManager, pipelineManager, queue, serviceManager, scmContext)); assertThat(exception).hasMessageEndingWith("value should be >= 0.0 and <= 1.0"); } @@ -311,7 +311,7 @@ public void testSafeModeExitRuleWithPipelineAvailabilityCheck( when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - conf, containers, containerManager, pipelineManager, queue, serviceManager, + conf, containerManager, pipelineManager, queue, serviceManager, scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); @@ -447,7 +447,7 @@ public void testDisableSafeMode() { ContainerManager containerManager = mock(ContainerManager.class); when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - conf, containers, containerManager, pipelineManager, queue, serviceManager, + conf, containerManager, pipelineManager, queue, serviceManager, scmContext); assertFalse(scmSafeModeManager.getInSafeMode()); } @@ -489,7 +489,7 @@ public void testContainerSafeModeRule() throws Exception { when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, null, queue, serviceManager, scmContext); + config, containerManager, null, queue, serviceManager, scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); @@ -565,7 +565,7 @@ public void testContainerSafeModeRuleEC(int data, int parity) throws Exception { new ContainerReplicaPendingOps(Clock.system(ZoneId.systemDefault()))); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, queue, serviceManager, scmContext); + config, containerManager, pipelineManager, queue, serviceManager, scmContext); assertTrue(scmSafeModeManager.getInSafeMode()); // Only 20 containers are involved in the calculation, @@ -588,7 +588,7 @@ private void testSafeModeDataNodes(int numOfDns) throws Exception { ContainerManager containerManager = mock(ContainerManager.class); when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - conf, containers, containerManager, null, queue, + conf, containerManager, null, queue, serviceManager, scmContext); // Assert SCM is in Safe mode. @@ -702,7 +702,7 @@ public void testSafeModePipelineExitRule() throws Exception { when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, queue, serviceManager, + config, containerManager, pipelineManager, queue, serviceManager, scmContext); SCMDatanodeProtocolServer.NodeRegistrationContainerReport nodeRegistrationContainerReport = @@ -757,7 +757,7 @@ public void testPipelinesNotCreatedUntilPreCheckPasses() throws Exception { when(containerManager.getContainers()).thenReturn(containers); scmSafeModeManager = new SCMSafeModeManager( - config, containers, containerManager, pipelineManager, queue, serviceManager, + config, containerManager, pipelineManager, queue, serviceManager, scmContext); // Assert SCM is in Safe mode.