This is an automated email from the ASF dual-hosted git repository.
sodonnell 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 cf3d0e7f8a HDDS-8017. Add check in ClosingContainerHandler for RM to
handle Missing Containers (#4598)
cf3d0e7f8a is described below
commit cf3d0e7f8a709bf664314845255e52f0f25c3a9f
Author: Mladjan Gadzic <[email protected]>
AuthorDate: Fri Apr 21 11:42:33 2023 +0200
HDDS-8017. Add check in ClosingContainerHandler for RM to handle Missing
Containers (#4598)
---
.../health/ClosingContainerHandler.java | 7 ++++
.../health/TestClosingContainerHandler.java | 49 ++++++++++++++++++++++
2 files changed, 56 insertions(+)
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosingContainerHandler.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosingContainerHandler.java
index 2ff21bbc97..e9db83c5f7 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosingContainerHandler.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosingContainerHandler.java
@@ -22,6 +22,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.ContainerReplicaProto;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.container.ContainerReplica;
+import org.apache.hadoop.hdds.scm.container.ReplicationManagerReport;
import org.apache.hadoop.hdds.scm.container.replication.ContainerCheckRequest;
import org.apache.hadoop.hdds.scm.container.replication.ReplicationManager;
import org.slf4j.Logger;
@@ -61,6 +62,12 @@ public class ClosingContainerHandler extends AbstractCheck {
boolean forceClose = request.getContainerInfo().getReplicationConfig()
.getReplicationType() != HddsProtos.ReplicationType.RATIS;
+ if (request.getContainerReplicas().size() == 0) {
+ request.getReport().incrementAndSample(
+ ReplicationManagerReport.HealthState.MISSING,
+ containerInfo.containerID());
+ }
+
for (ContainerReplica replica : request.getContainerReplicas()) {
if (replica.getState() != ContainerReplicaProto.State.UNHEALTHY) {
replicationManager.sendCloseContainerReplicaCommand(
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosingContainerHandler.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosingContainerHandler.java
index 06c2c7fa63..1c6a46e03c 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosingContainerHandler.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosingContainerHandler.java
@@ -161,6 +161,55 @@ public class TestClosingContainerHandler {
assertAndVerify(request, true, 1);
}
+ @Test
+ public void testClosingContainerStateIsNotUpdatedWhenThereAreReplicas() {
+ ContainerInfo containerInfo = ReplicationTestUtil.createContainerInfo(
+ RATIS_REPLICATION_CONFIG, 1, CLOSING);
+ Set<ContainerReplica> containerReplicas = ReplicationTestUtil
+ .createReplicas(containerInfo.containerID(),
+ ContainerReplicaProto.State.OPEN, 0, 0);
+ ContainerReplica openReplica = ReplicationTestUtil.createContainerReplica(
+ containerInfo.containerID(), 0,
+ HddsProtos.NodeOperationalState.IN_SERVICE,
+ ContainerReplicaProto.State.OPEN);
+ containerReplicas.add(openReplica);
+
+ ReplicationManagerReport report = new ReplicationManagerReport();
+
+ ContainerCheckRequest request = new ContainerCheckRequest.Builder()
+ .setPendingOps(Collections.emptyList())
+ .setReport(report)
+ .setContainerInfo(containerInfo)
+ .setContainerReplicas(containerReplicas)
+ .build();
+
+ assertAndVerify(request, true, 3);
+ report.getStats().forEach((k, v) -> Assertions.assertEquals(0L, v));
+ }
+
+ @Test
+ public void testClosingContainerStateIsUpdatedWhenThereAreNotReplicas() {
+ ContainerInfo containerInfo = ReplicationTestUtil.createContainerInfo(
+ RATIS_REPLICATION_CONFIG, 1, CLOSING);
+ Set<ContainerReplica> containerReplicas = new HashSet<>();
+ ReplicationManagerReport report = new ReplicationManagerReport();
+ ContainerCheckRequest request = new ContainerCheckRequest.Builder()
+ .setPendingOps(Collections.emptyList())
+ .setReport(report)
+ .setContainerInfo(containerInfo)
+ .setContainerReplicas(containerReplicas)
+ .build();
+
+ assertAndVerify(request, true, 0);
+ report.getStats().forEach((k, v) -> {
+ if (k.equals("MISSING")) {
+ Assertions.assertEquals(1L, v);
+ } else {
+ Assertions.assertEquals(0L, v);
+ }
+ });
+ }
+
/**
* Close commands should be sent for Open or Closing replicas.
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]