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]

Reply via email to