This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 2dd8a71cfa HDDS-11731. ContainerSafeModeRule Refactor (#7587)
2dd8a71cfa is described below
commit 2dd8a71cfa8b6c160e718835d2c056af4384797d
Author: Nandakumar Vadivelu <[email protected]>
AuthorDate: Sat Jan 4 13:42:34 2025 +0530
HDDS-11731. ContainerSafeModeRule Refactor (#7587)
---
.../hdds/scm/container/ContainerManager.java | 3 +
.../hdds/scm/container/ContainerManagerImpl.java | 7 +
.../hdds/scm/container/ContainerStateManager.java | 7 +
.../scm/container/ContainerStateManagerImpl.java | 8 +
.../scm/container/states/ContainerStateMap.java | 2 +-
.../hdds/scm/safemode/ContainerSafeModeRule.java | 169 +++++++++++----------
.../hdds/scm/safemode/SCMSafeModeManager.java | 5 -
.../hadoop/hdds/scm/safemode/SafeModeExitRule.java | 12 ++
.../hdds/scm/server/StorageContainerManager.java | 4 +-
.../hadoop/hdds/scm/block/TestBlockManager.java | 3 +-
.../hdds/scm/pipeline/TestPipelineManagerImpl.java | 4 +-
.../safemode/TestHealthyPipelineSafeModeRule.java | 6 +-
.../TestOneReplicaPipelineSafeModeRule.java | 2 +-
.../hdds/scm/safemode/TestSCMSafeModeManager.java | 20 +--
14 files changed, 143 insertions(+), 109 deletions(-)
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 6b6a888f42..2ddcb223bf 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.Map;
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 @@ public interface ContainerManager extends Closeable {
List<ContainerInfo> getContainers(ContainerID startID, int count);
+ List<ContainerInfo> 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 d61f9ee366..113903e647 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.conf.Configuration;
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 class ContainerManagerImpl implements
ContainerManager {
id + " not found."));
}
+
+ @Override
+ public List<ContainerInfo> getContainers(ReplicationType type) {
+ return toContainers(containerStateManager.getContainerIDs(type));
+ }
+
@Override
public List<ContainerInfo> 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 4f478b201c..263dc14469 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.NavigableSet;
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<ContainerID> getContainerIDs(LifeCycleState state);
+
+ /**
+ * Returns the IDs of the Containers whose ReplicationType matches the given
type.
+ */
+ Set<ContainerID> 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 28a732795b..f2cbe451ba 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 com.google.common.util.concurrent.Striped;
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 final class ContainerStateManagerImpl
}
}
+ @Override
+ public Set<ContainerID> 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 438e9709bf..4e6f0ed67c 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 @@ public class ContainerStateMap {
* @param type - Replication type -- StandAlone, Ratis etc.
* @return NavigableSet
*/
- NavigableSet<ContainerID> getContainerIDsByType(final ReplicationType type) {
+ public NavigableSet<ContainerID> 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 bdd7160de4..b66b6e9f0f 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.concurrent.atomic.AtomicLong;
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 com.google.common.base.Preconditions;
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<NodeRegistrationContainerReport> {
- 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<Long> ratisContainers;
- private Set<Long> ecContainers;
- private Map<Long, Set<UUID>> ecContainerDNsMap;
+ private final Set<Long> ratisContainers;
+ private final Set<Long> ecContainers;
+ private final Map<Long, Set<UUID>> 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<ContainerInfo> 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<NodeRegistrationContainerReport> getEventType() {
return SCMEvents.CONTAINER_REGISTRATION_REPORT;
@@ -104,45 +102,59 @@ public class ContainerSafeModeRule extends
@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<ContainerInfo> 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 @@ public class ContainerSafeModeRule extends
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 class ContainerSafeModeRule extends
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<Long> sampleRatisContainers = ratisContainers.stream().
@@ -264,8 +274,8 @@ public class ContainerSafeModeRule extends
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 class ContainerSafeModeRule extends
@Override
public synchronized void refresh(boolean forceRefresh) {
- List<ContainerInfo> 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<ContainerInfo> containers) {
-
+ private void initializeRule() {
+ final List<ContainerInfo> containers = containerManager.getContainers();
// Clean up the related data in the map.
ratisContainers.clear();
ecContainers.clear();
@@ -325,10 +329,9 @@ public class ContainerSafeModeRule extends
// 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 78ce994af7..f4e6f6ee2c 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 @@ package org.apache.hadoop.hdds.scm.safemode;
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 java.util.stream.Collectors;
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<String> 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<ContainerInfo> 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 69c1a86ac3..746e825f34 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<T> implements
EventHandler<T> {
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 abstract class SafeModeExitRule<T> implements
EventHandler<T> {
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 d117e891c4..52148c3d68 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
@@ -841,8 +841,8 @@ public final class StorageContainerManager extends
ServiceRuntimeInfoImpl
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 621c9297e7..528891623d 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 @@ public class TestBlockManager {
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 1dfbfd3278..900b09c014 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 class TestPipelineManagerImpl {
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 class TestPipelineManagerImpl {
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 13eb4be724..b2b3530c1e 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 class TestHealthyPipelineSafeModeRule {
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 class TestHealthyPipelineSafeModeRule {
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 class TestHealthyPipelineSafeModeRule {
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 76bafa8b1f..4459474021 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 @@ public class TestOneReplicaPipelineSafeModeRule {
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 fc8ec9c191..1d9a41b683 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 @@ public class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 @@ public class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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 class TestSCMSafeModeManager {
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.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]