This is an automated email from the ASF dual-hosted git repository.

siddhant 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 5a9dbb8503 HDDS-9729. Provide API to check a container via Replication 
Manager (#5632)
5a9dbb8503 is described below

commit 5a9dbb85032cb3c5c6066010c8e9e91c680d6301
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Fri Dec 1 11:55:06 2023 +0000

    HDDS-9729. Provide API to check a container via Replication Manager (#5632)
---
 .../replication/ContainerCheckRequest.java         | 13 ++++++-
 .../replication/NullReplicationQueue.java          | 40 ++++++++++++++++++++++
 .../container/replication/ReplicationManager.java  | 29 ++++++++++++++++
 .../health/ClosedWithUnhealthyReplicasHandler.java |  6 ++--
 .../health/ClosingContainerHandler.java            |  7 ++++
 .../health/DeletingContainerHandler.java           |  6 ++++
 .../health/ECReplicationCheckHandler.java          |  2 +-
 .../replication/health/EmptyContainerHandler.java  | 16 +++++----
 .../health/MismatchedReplicasHandler.java          |  3 ++
 .../replication/health/OpenContainerHandler.java   |  5 ++-
 .../health/QuasiClosedContainerHandler.java        | 10 ++++--
 .../replication/TestReplicationManager.java        | 25 ++++++++++++++
 .../TestClosedWithUnhealthyReplicasHandler.java    | 13 +++++++
 .../health/TestClosingContainerHandler.java        | 10 ++++--
 .../health/TestDeletingContainerHandler.java       | 20 +++++++----
 .../health/TestEmptyContainerHandler.java          | 18 ++++++++++
 .../health/TestMismatchedReplicasHandler.java      | 33 ++++++++++++++++++
 .../health/TestOpenContainerHandler.java           | 16 +++++++++
 .../health/TestQuasiClosedContainerHandler.java    | 20 +++++++++--
 19 files changed, 267 insertions(+), 25 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerCheckRequest.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerCheckRequest.java
index 9d51e20c33..93035b696c 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerCheckRequest.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ContainerCheckRequest.java
@@ -36,7 +36,7 @@ public final class ContainerCheckRequest {
   private final int maintenanceRedundancy;
   private final ReplicationManagerReport report;
   private final ReplicationQueue replicationQueue;
-
+  private final boolean readOnly;
 
   private ContainerCheckRequest(Builder builder) {
     this.containerInfo = builder.containerInfo;
@@ -46,6 +46,7 @@ public final class ContainerCheckRequest {
     this.maintenanceRedundancy = builder.maintenanceRedundancy;
     this.report = builder.report;
     this.replicationQueue = builder.replicationQueue;
+    this.readOnly = builder.readOnly;
   }
 
   public List<ContainerReplicaOp> getPendingOps() {
@@ -72,6 +73,10 @@ public final class ContainerCheckRequest {
     return replicationQueue;
   }
 
+  public boolean isReadOnly() {
+    return readOnly;
+  }
+
   /**
    * Builder class for ContainerCheckRequest.
    */
@@ -83,6 +88,7 @@ public final class ContainerCheckRequest {
     private int maintenanceRedundancy;
     private ReplicationManagerReport report;
     private ReplicationQueue replicationQueue;
+    private boolean readOnly = false;
 
     public Builder setContainerInfo(ContainerInfo containerInfo) {
       this.containerInfo = containerInfo;
@@ -115,6 +121,11 @@ public final class ContainerCheckRequest {
       return this;
     }
 
+    public Builder setReadOnly(boolean readOnly) {
+      this.readOnly = readOnly;
+      return this;
+    }
+
     public ContainerCheckRequest build() {
       return new ContainerCheckRequest(this);
     }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/NullReplicationQueue.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/NullReplicationQueue.java
new file mode 100644
index 0000000000..4e6148830e
--- /dev/null
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/NullReplicationQueue.java
@@ -0,0 +1,40 @@
+/**
+ * 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
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hdds.scm.container.replication;
+
+/**
+ * A class which extents ReplicationQueue and does nothing. This is used when
+ * checking containers in a read-only mode, where we don't want to queue them
+ * for replication.
+ */
+
+public class NullReplicationQueue extends ReplicationQueue {
+
+  @Override
+  public void enqueue(ContainerHealthResult.UnderReplicatedHealthResult
+                          underReplicatedHealthResult) {
+    // Do nothing
+  }
+
+  @Override
+  public void enqueue(ContainerHealthResult.OverReplicatedHealthResult
+                          overReplicatedHealthResult) {
+    // Do nothing
+  }
+
+}
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
index d34d14ad21..3b9f66595f 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java
@@ -197,6 +197,8 @@ public class ReplicationManager implements SCMService {
   private final UnderReplicatedProcessor underReplicatedProcessor;
   private final OverReplicatedProcessor overReplicatedProcessor;
   private final HealthCheck containerCheckChain;
+  private final ReplicationQueue nullReplicationQueue =
+      new NullReplicationQueue();
 
   /**
    * Constructs ReplicationManager instance with the given configuration.
@@ -840,6 +842,12 @@ public class ReplicationManager implements SCMService {
   protected void processContainer(ContainerInfo containerInfo,
       ReplicationQueue repQueue, ReplicationManagerReport report)
       throws ContainerNotFoundException {
+    processContainer(containerInfo, repQueue, report, false);
+  }
+
+  protected boolean processContainer(ContainerInfo containerInfo,
+      ReplicationQueue repQueue, ReplicationManagerReport report,
+      boolean readOnly) throws ContainerNotFoundException {
     synchronized (containerInfo) {
       ContainerID containerID = containerInfo.containerID();
       final boolean isEC = isEC(containerInfo.getReplicationConfig());
@@ -856,6 +864,7 @@ public class ReplicationManager implements SCMService {
           .setReport(report)
           .setPendingOps(pendingOps)
           .setReplicationQueue(repQueue)
+          .setReadOnly(readOnly)
           .build();
       // This will call the chain of container health handlers in turn which
       // will issue commands as needed, update the report and perhaps add
@@ -865,6 +874,7 @@ public class ReplicationManager implements SCMService {
         LOG.debug("Container {} had no actions after passing through the " +
             "check chain", containerInfo.containerID());
       }
+      return handled;
     }
   }
 
@@ -969,6 +979,25 @@ public class ReplicationManager implements SCMService {
     }
   }
 
+  /**
+   * This method is used to check the container health status. It runs all the
+   * same checks ReplicationManager runs against a container to determine if it
+   * is under replicated or over replicated etc, but in a readOnly mode so no
+   * commands are sent. The passed in ReplicationManagerReport is updated and
+   * the caller can query it on return to see the results of the check.
+   * @param containerInfo The container to check
+   * @param report The instance of the replicationManager report to update with
+   *               the results of the check.
+   * @return True if the handler chain took action on the request or false 
other
+   *         wise. If the method returns false, then the container is deemed
+   *         healthy by replication manager.
+   */
+  public boolean checkContainerStatus(ContainerInfo containerInfo,
+      ReplicationManagerReport report) throws ContainerNotFoundException {
+    report.increment(containerInfo.getState());
+    return processContainer(containerInfo, nullReplicationQueue, report, true);
+  }
+
   /**
    * Retrieve a list of any pending container replications or deletes for the
    * given containerID.
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosedWithUnhealthyReplicasHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosedWithUnhealthyReplicasHandler.java
index b5dd9ed3c3..1b23c7580b 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosedWithUnhealthyReplicasHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ClosedWithUnhealthyReplicasHandler.java
@@ -102,11 +102,13 @@ public class ClosedWithUnhealthyReplicasHandler extends 
AbstractCheck {
         }
 
         foundUnhealthy = true;
-        sendDeleteCommand(containerInfo, replica);
+        if (!request.isReadOnly()) {
+          sendDeleteCommand(containerInfo, replica);
+        }
       }
     }
 
-    // some unhealthy replicas were found so the container must be over
+    // some unhealthy replicas were found so the container must be
     // over replicated due to unhealthy replicas.
     if (foundUnhealthy) {
       request.getReport().incrementAndSample(
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 428d12e28e..97beb1dce2 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
@@ -70,12 +70,19 @@ public class ClosingContainerHandler extends AbstractCheck {
     boolean forceClose = containerInfo.getReplicationConfig()
         .getReplicationType() != ReplicationType.RATIS;
 
+    // TODO - review this logic - may need an empty check here
     if (request.getContainerReplicas().isEmpty()) {
       request.getReport().incrementAndSample(
           ReplicationManagerReport.HealthState.MISSING,
           containerInfo.containerID());
     }
 
+    if (request.isReadOnly()) {
+      // The reset of this method modifies container state, so we just return
+      // here if the request is read only.
+      return true;
+    }
+
     boolean allUnhealthy = true;
     for (ContainerReplica replica : request.getContainerReplicas()) {
       if (replica.getState() != ContainerReplicaProto.State.UNHEALTHY) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/DeletingContainerHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/DeletingContainerHandler.java
index d4b8b262b5..eaaee48546 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/DeletingContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/DeletingContainerHandler.java
@@ -70,6 +70,12 @@ public class DeletingContainerHandler extends AbstractCheck {
     LOG.debug("Checking container {} in DeletingContainerHandler",
         containerInfo);
 
+    if (request.isReadOnly()) {
+      // The reset of this method modifies state, so we just return true if
+      // the request is read only
+      return true;
+    }
+
     if (request.getContainerReplicas().size() == 0) {
       LOG.debug("Deleting Container {} has no replicas so marking for cleanup" 
+
           " and returning true", containerInfo);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECReplicationCheckHandler.java
index f4677f8215..197b53ed90 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECReplicationCheckHandler.java
@@ -131,7 +131,7 @@ public class ECReplicationCheckHandler extends 
AbstractCheck {
         // via an EC reconstruction command. Note that it may also have some
         // replicas in decommission / maintenance states, but as the under
         // replication is not caused only by decommission, we say it is not
-        // due to decommission/
+        // due to decommission
         dueToOutOfService = false;
         remainingRedundancy = repConfig.getParity() - missingIndexes.size();
       }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/EmptyContainerHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/EmptyContainerHandler.java
index 69804698f2..19f5097a27 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/EmptyContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/EmptyContainerHandler.java
@@ -60,14 +60,16 @@ public class EmptyContainerHandler extends AbstractCheck {
       request.getReport()
           .incrementAndSample(ReplicationManagerReport.HealthState.EMPTY,
               containerInfo.containerID());
-      LOG.debug("Container {} is empty and closed, marking as DELETING",
-          containerInfo);
-      // delete replicas if they are closed and empty
-      deleteContainerReplicas(containerInfo, replicas);
+      if (!request.isReadOnly()) {
+        LOG.debug("Container {} is empty and closed, marking as DELETING",
+            containerInfo);
+        // delete replicas if they are closed and empty
+        deleteContainerReplicas(containerInfo, replicas);
 
-      // Update the container's state
-      replicationManager.updateContainerState(
-          containerInfo.containerID(), HddsProtos.LifeCycleEvent.DELETE);
+        // Update the container's state
+        replicationManager.updateContainerState(
+            containerInfo.containerID(), HddsProtos.LifeCycleEvent.DELETE);
+      }
       return true;
     } else if (containerInfo.getState() == HddsProtos.LifeCycleState.CLOSED
         && containerInfo.getNumberOfKeys() == 0 && replicas.isEmpty()) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/MismatchedReplicasHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/MismatchedReplicasHandler.java
index ecfdf0c90e..68df0e7ed4 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/MismatchedReplicasHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/MismatchedReplicasHandler.java
@@ -68,6 +68,9 @@ public class MismatchedReplicasHandler extends AbstractCheck {
     LOG.debug("Checking container {} in MismatchedReplicasHandler",
         containerInfo);
 
+    if (request.isReadOnly()) {
+      return false;
+    }
     // close replica if needed
     for (ContainerReplica replica : replicas) {
       if (shouldBeClosed(containerInfo, replica)) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/OpenContainerHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/OpenContainerHandler.java
index a644f5e834..2c0b405db9 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/OpenContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/OpenContainerHandler.java
@@ -62,7 +62,10 @@ public class OpenContainerHandler extends AbstractCheck {
         request.getReport().incrementAndSample(
             ReplicationManagerReport.HealthState.OPEN_UNHEALTHY,
             containerInfo.containerID());
-        
replicationManager.sendCloseContainerEvent(containerInfo.containerID());
+        if (!request.isReadOnly()) {
+          replicationManager
+              .sendCloseContainerEvent(containerInfo.containerID());
+        }
         return true;
       }
       // For open containers we do not want to do any further processing in RM
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedContainerHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedContainerHandler.java
index 01f6a05d77..94a93af107 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedContainerHandler.java
@@ -36,6 +36,9 @@ import java.util.stream.Collectors;
  * Class for handling containers that are in QUASI_CLOSED state. This will
  * send commands to Datanodes to force close these containers if they satisfy
  * the requirements to be force closed. Only meant for RATIS containers.
+ *
+ * Note - this handler always returns false so further handlers can can for
+ * under and over replication etc.
  */
 public class QuasiClosedContainerHandler extends AbstractCheck {
   public static final Logger LOG =
@@ -69,8 +72,9 @@ public class QuasiClosedContainerHandler extends 
AbstractCheck {
 
     Set<ContainerReplica> replicas = request.getContainerReplicas();
     if (canForceCloseContainer(containerInfo, replicas)) {
-      forceCloseContainer(containerInfo, replicas);
-      return true;
+      if (!request.isReadOnly()) {
+        forceCloseContainer(containerInfo, replicas);
+      }
     } else {
       LOG.debug("Container {} cannot be force closed and is stuck in " +
               "QUASI_CLOSED", containerInfo);
@@ -78,6 +82,8 @@ public class QuasiClosedContainerHandler extends 
AbstractCheck {
           ReplicationManagerReport.HealthState.QUASI_CLOSED_STUCK,
           containerInfo.containerID());
     }
+    // Always return false, even if commands were sent. That way, under and
+    // over replication handlers can to check for other issues in the 
container.
     return false;
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
index f31db93dfb..d2b2d18d35 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java
@@ -510,6 +510,17 @@ public class TestReplicationManager {
     assertEquals(0, repQueue.overReplicatedQueueSize());
   }
 
+  @Test
+  public void testHealthyContainerStatus() throws ContainerNotFoundException {
+    ContainerInfo container = createContainerInfo(repConfig, 1,
+        HddsProtos.LifeCycleState.CLOSED);
+    addReplicas(container, ContainerReplicaProto.State.CLOSED, 1, 2, 3, 4, 5);
+
+    boolean result = replicationManager.checkContainerStatus(
+        container, repReport);
+    assertEquals(false, result);
+  }
+
   @Test
   public void testUnderReplicatedContainer() throws ContainerNotFoundException 
{
     ContainerInfo container = createContainerInfo(repConfig, 1,
@@ -524,6 +535,20 @@ public class TestReplicationManager {
         ReplicationManagerReport.HealthState.UNDER_REPLICATED));
   }
 
+  @Test
+  public void testUnderReplicatedContainerStatus()
+      throws ContainerNotFoundException {
+    ContainerInfo container = createContainerInfo(repConfig, 1,
+        HddsProtos.LifeCycleState.CLOSED);
+    addReplicas(container, ContainerReplicaProto.State.CLOSED, 1, 2, 3, 4);
+
+    boolean result = replicationManager.checkContainerStatus(
+        container, repReport);
+    assertEquals(1, repReport.getStat(
+        ReplicationManagerReport.HealthState.UNDER_REPLICATED));
+    assertEquals(true, result);
+  }
+
   /**
    * {@link
    * ReplicationManager#getContainerReplicationHealth(ContainerInfo, Set)}
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosedWithUnhealthyReplicasHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosedWithUnhealthyReplicasHandler.java
index 073717d26e..921538da94 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosedWithUnhealthyReplicasHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestClosedWithUnhealthyReplicasHandler.java
@@ -137,10 +137,23 @@ public class TestClosedWithUnhealthyReplicasHandler {
         .setContainerInfo(container)
         .build();
 
+    ContainerCheckRequest readRequest = requestBuilder
+        .setContainerReplicas(containerReplicas)
+        .setContainerInfo(container)
+        .setReadOnly(true)
+        .build();
+
     assertTrue(handler.handle(request));
     assertEquals(1, request.getReport().getStat(
         ReplicationManagerReport.HealthState.OVER_REPLICATED));
 
+    assertTrue(handler.handle(readRequest));
+    // Same report object is incremented again
+    assertEquals(2, request.getReport().getStat(
+        ReplicationManagerReport.HealthState.OVER_REPLICATED));
+
+    // Only a single delete should be sent, as the read request should not have
+    // triggered one.
     ArgumentCaptor<Integer> replicaIndexCaptor =
         ArgumentCaptor.forClass(Integer.class);
     Mockito.verify(replicationManager, Mockito.times(2))
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 a89730424a..c04b8b2fc7 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
@@ -191,13 +191,17 @@ public class TestClosingContainerHandler {
 
     ReplicationManagerReport report = new ReplicationManagerReport();
 
-    ContainerCheckRequest request = new ContainerCheckRequest.Builder()
+    ContainerCheckRequest.Builder builder = new ContainerCheckRequest.Builder()
         .setPendingOps(Collections.emptyList())
         .setReport(report)
         .setContainerInfo(containerInfo)
-        .setContainerReplicas(containerReplicas)
-        .build();
+        .setContainerReplicas(containerReplicas);
+    ContainerCheckRequest request = builder.build();
+
+    builder.setReadOnly(true);
+    ContainerCheckRequest readRequest = builder.build();
 
+    assertAndVerify(readRequest, true, 0);
     assertAndVerify(request, true, 3);
     report.getStats().forEach((k, v) -> Assertions.assertEquals(0L, v));
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
index bc233754f1..fc63a825dc 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestDeletingContainerHandler.java
@@ -126,24 +126,32 @@ public class TestDeletingContainerHandler {
         HddsProtos.ReplicationFactor.THREE), 1);
 
     //ec container
-    //since updateContainerState is called once when testing
-    //ratis container, so here should be 1+1 = 2 times
-    cleanupIfNoReplicaExist(ecReplicationConfig, 2);
+    cleanupIfNoReplicaExist(ecReplicationConfig, 1);
   }
 
 
   private void cleanupIfNoReplicaExist(
       ReplicationConfig replicationConfig, int times) {
+    Mockito.clearInvocations(replicationManager);
     ContainerInfo containerInfo = ReplicationTestUtil.createContainerInfo(
         replicationConfig, 1, DELETING);
 
     Set<ContainerReplica> containerReplicas = new HashSet<>();
-    ContainerCheckRequest request = new ContainerCheckRequest.Builder()
+    ContainerCheckRequest.Builder builder = new ContainerCheckRequest.Builder()
         .setPendingOps(Collections.emptyList())
         .setReport(new ReplicationManagerReport())
         .setContainerInfo(containerInfo)
-        .setContainerReplicas(containerReplicas)
-        .build();
+        .setContainerReplicas(containerReplicas);
+
+    ContainerCheckRequest request = builder.build();
+
+    builder.setReadOnly(true);
+    ContainerCheckRequest readRequest = builder.build();
+
+    Assertions.assertTrue(deletingContainerHandler.handle(readRequest));
+    Mockito.verify(replicationManager, Mockito.times(0))
+        .updateContainerState(Mockito.any(ContainerID.class),
+            Mockito.any(HddsProtos.LifeCycleEvent.class));
 
     Assertions.assertTrue(deletingContainerHandler.handle(request));
     Mockito.verify(replicationManager, Mockito.times(times))
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestEmptyContainerHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestEmptyContainerHandler.java
index 760ec9b7d4..e89164250a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestEmptyContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestEmptyContainerHandler.java
@@ -87,6 +87,15 @@ public class TestEmptyContainerHandler {
         .setContainerReplicas(containerReplicas)
         .build();
 
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
+
+    assertAndVerify(readRequest, true, 0, 1);
     assertAndVerify(request, true, 5, 1);
   }
 
@@ -109,6 +118,15 @@ public class TestEmptyContainerHandler {
         .setContainerReplicas(containerReplicas)
         .build();
 
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
+
+    assertAndVerify(readRequest, true, 0, 1);
     assertAndVerify(request, true, 3, 1);
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestMismatchedReplicasHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestMismatchedReplicasHandler.java
index cb5f4649e4..db875bc688 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestMismatchedReplicasHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestMismatchedReplicasHandler.java
@@ -128,9 +128,18 @@ public class TestMismatchedReplicasHandler {
         .setContainerReplicas(containerReplicas)
         .build();
 
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
+
     // this handler always returns false so other handlers can fix issues
     // such as under replication
     Assertions.assertFalse(handler.handle(request));
+    Assertions.assertFalse(handler.handle(readRequest));
 
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerReplicaCommand(
@@ -207,10 +216,18 @@ public class TestMismatchedReplicasHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
 
     // this handler always returns false so other handlers can fix issues
     // such as under replication
     Assertions.assertFalse(handler.handle(request));
+    Assertions.assertFalse(handler.handle(readRequest));
 
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerReplicaCommand(
@@ -254,10 +271,18 @@ public class TestMismatchedReplicasHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
 
     // this handler always returns false so other handlers can fix issues
     // such as under replication
     Assertions.assertFalse(handler.handle(request));
+    Assertions.assertFalse(handler.handle(readRequest));
 
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerReplicaCommand(
@@ -296,10 +321,18 @@ public class TestMismatchedReplicasHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
 
     // this handler always returns false so other handlers can fix issues
     // such as under replication
     Assertions.assertFalse(handler.handle(request));
+    Assertions.assertFalse(handler.handle(readRequest));
 
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerReplicaCommand(
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestOpenContainerHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestOpenContainerHandler.java
index 4ed8beea75..32ef98e76a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestOpenContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestOpenContainerHandler.java
@@ -107,7 +107,15 @@ public class TestOpenContainerHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
     Assertions.assertTrue(openContainerHandler.handle(request));
+    Assertions.assertTrue(openContainerHandler.handle(readRequest));
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerEvent(containerInfo.containerID());
   }
@@ -161,7 +169,15 @@ public class TestOpenContainerHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
     Assertions.assertTrue(openContainerHandler.handle(request));
+    Assertions.assertTrue(openContainerHandler.handle(readRequest));
     Mockito.verify(replicationManager, times(1))
         .sendCloseContainerEvent(Mockito.any());
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedContainerHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedContainerHandler.java
index da1b818a06..899b657155 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedContainerHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedContainerHandler.java
@@ -128,8 +128,16 @@ public class TestQuasiClosedContainerHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
 
-    Assertions.assertTrue(quasiClosedContainerHandler.handle(request));
+    Assertions.assertFalse(quasiClosedContainerHandler.handle(request));
+    Assertions.assertFalse(quasiClosedContainerHandler.handle(readRequest));
     Mockito.verify(replicationManager, times(2))
         .sendCloseContainerReplicaCommand(any(), any(), anyBoolean());
   }
@@ -224,8 +232,16 @@ public class TestQuasiClosedContainerHandler {
         .setContainerInfo(containerInfo)
         .setContainerReplicas(containerReplicas)
         .build();
+    ContainerCheckRequest readRequest = new ContainerCheckRequest.Builder()
+        .setPendingOps(Collections.emptyList())
+        .setReport(new ReplicationManagerReport())
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(containerReplicas)
+        .setReadOnly(true)
+        .build();
 
-    Assertions.assertTrue(quasiClosedContainerHandler.handle(request));
+    Assertions.assertFalse(quasiClosedContainerHandler.handle(request));
+    Assertions.assertFalse(quasiClosedContainerHandler.handle(readRequest));
     // verify close command was sent for replicas with sequence ID 1001, that
     // is dnTwo and dnThree
     Mockito.verify(replicationManager, times(1))


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to