Skip to content

Commit 9740d44

Browse files
committed
correct ec container without report validate logic
1 parent d5cc309 commit 9740d44

1 file changed

Lines changed: 28 additions & 1 deletion

File tree

hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/ECContainerSafeModeRule.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.common.base.Preconditions;
2525
import com.google.common.collect.Sets;
2626
import java.util.HashSet;
27+
import java.util.List;
2728
import java.util.Map;
2829
import java.util.Set;
2930
import java.util.UUID;
@@ -35,6 +36,7 @@
3536
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
3637
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
3738
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState;
39+
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
3840
import org.apache.hadoop.hdds.scm.container.ContainerID;
3941
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
4042
import org.apache.hadoop.hdds.scm.container.ContainerManager;
@@ -92,7 +94,32 @@ protected synchronized boolean validate() {
9294
if (validateBasedOnReportProcessing()) {
9395
return getCurrentContainerThreshold() >= safeModeCutoff;
9496
}
95-
return false;
97+
98+
final List<ContainerInfo> containers = containerManager.getContainers(
99+
ReplicationType.EC);
100+
101+
return containers.stream()
102+
.filter(this::isClosed)
103+
.map(ContainerInfo::containerID)
104+
.noneMatch(this::isMissing);
105+
}
106+
107+
/**
108+
* Checks if the container has at least the minimum required number of replicas.
109+
*/
110+
private boolean isMissing(ContainerID id) {
111+
try {
112+
int minReplica = getMinReplica(id.getId());
113+
return containerManager.getContainerReplicas(id).size() < minReplica;
114+
} catch (ContainerNotFoundException ex) {
115+
/*
116+
* This should never happen, in case this happens the container
117+
* somehow got removed from SCM.
118+
* Safemode rule doesn't have to log/fix this. We will just exclude this
119+
* from the rule validation.
120+
*/
121+
return false;
122+
}
96123
}
97124

98125
@VisibleForTesting

0 commit comments

Comments
 (0)