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 60274badc16 HDDS-16405. ReplicationManagerReport should not be used 
for transient state (#11230)
60274badc16 is described below

commit 60274badc163b79c229f758559e83fbffc705588
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Fri Sep 18 14:45:10 2026 +0100

    HDDS-16405. ReplicationManagerReport should not be used for transient state 
(#11230)
---
 .../scm/container/ReplicationManagerReport.java    | 10 ----
 .../replication/ContainerCheckRequest.java         | 11 ++++
 .../container/replication/ReplicationManager.java  |  6 +--
 .../health/ClosedWithUnhealthyReplicasHandler.java |  2 +-
 .../health/ClosingContainerHandler.java            |  2 +-
 .../health/ECMisReplicationCheckHandler.java       |  4 +-
 .../health/ECReplicationCheckHandler.java          |  7 +--
 .../replication/health/EmptyContainerHandler.java  |  6 +--
 .../replication/health/OpenContainerHandler.java   |  8 +--
 .../health/QuasiClosedContainerHandler.java        |  2 +-
 .../health/QuasiClosedStuckReplicationCheck.java   |  9 ++--
 .../health/RatisReplicationCheckHandler.java       | 10 ++--
 .../RatisUnhealthyReplicationCheckHandler.java     |  8 ++-
 .../health/VulnerableUnhealthyReplicasHandler.java |  4 +-
 .../replication/TestContainerCheckRequest.java     | 58 ++++++++++++++++++++++
 .../TestQuasiClosedStuckReplicationCheck.java      |  1 -
 16 files changed, 94 insertions(+), 54 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManagerReport.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManagerReport.java
index aacb5e40dd2..1de3f4216a4 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManagerReport.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManagerReport.java
@@ -54,7 +54,6 @@ public class ReplicationManagerReport {
 
   private final Map<String, LongAdder> stats;
   private final Map<String, List<ContainerID>> containerSample = new 
ConcurrentHashMap<>();
-  private ContainerHealthState containerHealthState = 
ContainerHealthState.HEALTHY;
 
   public static ReplicationManagerReport fromProtobuf(
       HddsProtos.ReplicationManagerReportProto proto) {
@@ -87,7 +86,6 @@ public void increment(ContainerHealthState stat) {
 
   public void incrementAndSample(ContainerHealthState stat, ContainerInfo 
containerInfo) {
     incrementAndSample(stat.name(), containerInfo.containerID());
-    containerHealthState = stat;
   }
 
   public void increment(HddsProtos.LifeCycleState stat) {
@@ -106,14 +104,6 @@ public long getReportTimeStamp() {
     return reportTimeStamp;
   }
 
-  public ContainerHealthState getContainerHealthState() {
-    return containerHealthState;
-  }
-
-  public void resetContainerHealthState() {
-    this.containerHealthState = ContainerHealthState.HEALTHY;
-  }
-
   /**
    * Return a map of all stats and their value as a long.
    */
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 651e728d012..1cf5d373a40 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
@@ -20,6 +20,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import org.apache.hadoop.hdds.scm.container.ContainerReplica;
 import org.apache.hadoop.hdds.scm.container.ReplicationManagerReport;
@@ -37,6 +38,7 @@ public final class ContainerCheckRequest {
   private final ReplicationManagerReport report;
   private final ReplicationQueue replicationQueue;
   private final boolean readOnly;
+  private ContainerHealthState healthState = ContainerHealthState.HEALTHY;
 
   private ContainerCheckRequest(Builder builder) {
     this.containerInfo = builder.containerInfo;
@@ -77,6 +79,15 @@ public boolean isReadOnly() {
     return readOnly;
   }
 
+  public ContainerHealthState getHealthState() {
+    return healthState;
+  }
+
+  public void setHealthState(ContainerHealthState state) {
+    this.healthState = state;
+    report.incrementAndSample(state, containerInfo);
+  }
+
   /**
    * Builder class for ContainerCheckRequest.
    */
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 f890fb6a082..1742f735cc9 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
@@ -858,8 +858,6 @@ protected boolean processContainer(ContainerInfo 
containerInfo,
         return false;
       }
       
-      // Reset health state to HEALTHY before processing this container
-      report.resetContainerHealthState();
       final boolean isEC = isEC(containerInfo.getReplicationConfig());
 
       ContainerCheckRequest checkRequest = new ContainerCheckRequest.Builder()
@@ -878,10 +876,8 @@ protected boolean processContainer(ContainerInfo 
containerInfo,
       if (!handled) {
         LOG.debug("Container {} had no actions after passing through the " +
             "check chain", containerInfo.containerID());
-        // Container remains HEALTHY (set at start of loop)
       }
-      // Apply final health state from report to container
-      containerInfo.setHealthState(report.getContainerHealthState());
+      containerInfo.setHealthState(checkRequest.getHealthState());
       return handled;
     }
   }
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 9524bf930de..93eae4bd378 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
@@ -109,7 +109,7 @@ public boolean handle(ContainerCheckRequest request) {
     // some unhealthy replicas were found so the container must be
     // over replicated due to unhealthy replicas.
     if (foundUnhealthy) {
-      
request.getReport().incrementAndSample(ContainerHealthState.UNHEALTHY_OVER_REPLICATED,
 containerInfo);
+      request.setHealthState(ContainerHealthState.UNHEALTHY_OVER_REPLICATED);
     }
     LOG.debug("Returning {} for container {}", foundUnhealthy, containerInfo);
     return foundUnhealthy;
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 a09f5079ffe..34b263e7fc3 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,7 +70,7 @@ public boolean handle(ContainerCheckRequest request) {
 
     // TODO - review this logic - may need an empty check here
     if (request.getContainerReplicas().isEmpty()) {
-      request.getReport().incrementAndSample(ContainerHealthState.MISSING, 
containerInfo);
+      request.setHealthState(ContainerHealthState.MISSING);
     }
 
     if (request.isReadOnly()) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECMisReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECMisReplicationCheckHandler.java
index fab17379431..ab130dc5361 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECMisReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/ECMisReplicationCheckHandler.java
@@ -30,7 +30,6 @@
 import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 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.ContainerHealthResult;
 import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaOp;
@@ -59,14 +58,13 @@ public boolean handle(ContainerCheckRequest request) {
       return false;
     }
 
-    ReplicationManagerReport report = request.getReport();
     ContainerInfo container = request.getContainerInfo();
     LOG.debug("Checking container {} for mis replication.", container);
 
     ContainerHealthResult health = checkMisReplication(request);
     if (health.getHealthState() ==
         ContainerHealthResult.HealthState.MIS_REPLICATED) {
-      report.incrementAndSample(ContainerHealthState.MIS_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.MIS_REPLICATED);
       ContainerHealthResult.MisReplicatedHealthResult misRepHealth
           = ((ContainerHealthResult.MisReplicatedHealthResult) health);
       if (!misRepHealth.isReplicatedOkAfterPending()) {
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 8fa1f067b40..37f35a05fbc 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
@@ -25,7 +25,6 @@
 import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 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.ContainerHealthResult;
 import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaOp;
@@ -49,7 +48,6 @@ public boolean handle(ContainerCheckRequest request) {
       // This handler is only for EC containers.
       return false;
     }
-    ReplicationManagerReport report = request.getReport();
     ContainerInfo container = request.getContainerInfo();
     ContainerHealthResult health = checkHealth(request);
     LOG.debug("Checking container {} in ECReplicationCheckHandler", container);
@@ -84,16 +82,15 @@ public boolean handle(ContainerCheckRequest request) {
             healthState = ContainerHealthState.UNHEALTHY;
           }
         }
-        report.incrementAndSample(healthState, container);
       } else {
         healthState = ContainerHealthState.UNDER_REPLICATED;
-        report.incrementAndSample(healthState, container);
       }
       if (!underHealth.isReplicatedOkAfterPending() &&
           (!underHealth.isUnrecoverable()
               || (underHealth.hasUnreplicatedOfflineIndexes() && 
!underHealth.offlineIndexesOkAfterPending()))) {
         request.getReplicationQueue().enqueue(underHealth);
       }
+      request.setHealthState(healthState);
       LOG.debug("Container {} is Under Replicated. isReplicatedOkAfterPending "
           + "is [{}]. isUnrecoverable is [{}]. isMissing is [{}]. "
           + "hasUnreplicatedOfflineIndexes is [{}]",
@@ -103,7 +100,7 @@ public boolean handle(ContainerCheckRequest request) {
       return true;
     } else if (health.getHealthState()
         == ContainerHealthResult.HealthState.OVER_REPLICATED) {
-      report.incrementAndSample(ContainerHealthState.OVER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.OVER_REPLICATED);
       ContainerHealthResult.OverReplicatedHealthResult overHealth
           = ((ContainerHealthResult.OverReplicatedHealthResult) health);
       if (!overHealth.isReplicatedOkAfterPending()) {
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 9eb8ebf4c05..03d473a59e8 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
@@ -57,7 +57,7 @@ public boolean handle(ContainerCheckRequest request) {
     Set<ContainerReplica> replicas = request.getContainerReplicas();
 
     if (isContainerEmptyAndClosed(containerInfo, replicas)) {
-      request.getReport().incrementAndSample(ContainerHealthState.EMPTY, 
containerInfo);
+      request.setHealthState(ContainerHealthState.EMPTY);
       if (!request.isReadOnly()) {
         LOG.debug("Container {} is empty and closed, marking as DELETING",
             containerInfo);
@@ -77,7 +77,7 @@ public boolean handle(ContainerCheckRequest request) {
       }
       return true;
     } else if (isContainerEmptyAndQuasiClosed(containerInfo, replicas)) {
-      request.getReport().incrementAndSample(ContainerHealthState.EMPTY, 
containerInfo);
+      request.setHealthState(ContainerHealthState.EMPTY);
       if (!request.isReadOnly()) {
         String originIds = replicas.stream()
             .map(r -> r.getOriginDatanodeId().toString())
@@ -115,7 +115,7 @@ public boolean handle(ContainerCheckRequest request) {
       // information to delete the container, so we just log it as EMPTY,
       // leaving it as CLOSED and return true, otherwise, it will end up marked
       // as missing in the replication check handlers.
-      request.getReport().incrementAndSample(ContainerHealthState.EMPTY, 
containerInfo);
+      request.setHealthState(ContainerHealthState.EMPTY);
       LOG.debug("Container {} appears empty and is closed, but cannot be " +
               "deleted because it has no replicas. Marking as EMPTY.",
           containerInfo);
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 8b36816276a..bdee582a453 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
@@ -63,10 +63,10 @@ public boolean handle(ContainerCheckRequest request) {
         LOG.info("Container {} is open but {}. Triggering close.",
             containerInfo, noPipeline ? "has no Pipeline" : "unhealthy");
 
-        request.getReport().incrementAndSample(noPipeline ?
-                ContainerHealthState.OPEN_WITHOUT_PIPELINE :
-                ContainerHealthState.OPEN_UNHEALTHY,
-            containerInfo);
+        ContainerHealthState openHealthState = noPipeline ?
+            ContainerHealthState.OPEN_WITHOUT_PIPELINE :
+            ContainerHealthState.OPEN_UNHEALTHY;
+        request.setHealthState(openHealthState);
 
         if (!request.isReadOnly()) {
           replicationManager
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 0a51df64deb..cf0ba6a71eb 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
@@ -76,7 +76,7 @@ public boolean handle(ContainerCheckRequest request) {
     } else {
       LOG.debug("Container {} cannot be force closed and is stuck in " +
               "QUASI_CLOSED", containerInfo);
-      
request.getReport().incrementAndSample(ContainerHealthState.QUASI_CLOSED_STUCK, 
containerInfo);
+      request.setHealthState(ContainerHealthState.QUASI_CLOSED_STUCK);
     }
     // Always return false, even if commands were sent. That way, under and
     // over replication handlers can to check for other issues in the 
container.
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedStuckReplicationCheck.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedStuckReplicationCheck.java
index e520153ad84..1c8b3e78ac3 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedStuckReplicationCheck.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/QuasiClosedStuckReplicationCheck.java
@@ -73,8 +73,7 @@ public boolean handle(ContainerCheckRequest request) {
 
     if (request.getContainerReplicas().isEmpty()) {
       // If there are no replicas, mark as QUASI_CLOSED_STUCK + MISSING 
combination
-      
request.getReport().incrementAndSample(ContainerHealthState.QUASI_CLOSED_STUCK_MISSING,
 
-          request.getContainerInfo());
+      request.setHealthState(ContainerHealthState.QUASI_CLOSED_STUCK_MISSING);
       return true;
     }
 
@@ -101,8 +100,7 @@ public boolean handle(ContainerCheckRequest request) {
     if (replicaCount.isUnderReplicated()) {
       LOG.debug("Container {} is quasi-closed-stuck under-replicated", 
request.getContainerInfo());
       // Container is both QUASI_CLOSED_STUCK and UNDER_REPLICATED
-      
request.getReport().incrementAndSample(ContainerHealthState.QUASI_CLOSED_STUCK_UNDER_REPLICATED,
 
-          request.getContainerInfo());
+      
request.setHealthState(ContainerHealthState.QUASI_CLOSED_STUCK_UNDER_REPLICATED);
       if (pendingAdd == 0) {
         // Only queue if there are no pending adds, as that could correct the 
under replication.
         LOG.debug("Queueing under-replicated health result for container {}", 
request.getContainerInfo());
@@ -117,8 +115,7 @@ public boolean handle(ContainerCheckRequest request) {
     if (replicaCount.isOverReplicated()) {
       LOG.debug("Container {} is quasi-closed-stuck over-replicated", 
request.getContainerInfo());
       // Container is both QUASI_CLOSED_STUCK and OVER_REPLICATED
-      
request.getReport().incrementAndSample(ContainerHealthState.QUASI_CLOSED_STUCK_OVER_REPLICATED,
 
-          request.getContainerInfo());
+      
request.setHealthState(ContainerHealthState.QUASI_CLOSED_STUCK_OVER_REPLICATED);
       if (pendingDelete == 0) {
         // Only queue if there are no pending deletes which could correct the 
over replication
         LOG.debug("Queueing over-replicated health result for container {}", 
request.getContainerInfo());
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisReplicationCheckHandler.java
index 2a0afe07afa..88369c6c952 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisReplicationCheckHandler.java
@@ -31,7 +31,6 @@
 import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 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.ContainerHealthResult;
 import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaOp;
@@ -84,7 +83,6 @@ public boolean handle(ContainerCheckRequest request) {
         .shouldHandleAsQuasiClosedStuck(request.getContainerInfo(), 
request.getContainerReplicas())) {
       return false;
     }
-    ReplicationManagerReport report = request.getReport();
     ContainerInfo container = request.getContainerInfo();
     ContainerHealthResult health = checkHealth(request);
     LOG.debug("Checking container {} in RatisReplicationCheckHandler",
@@ -117,10 +115,10 @@ public boolean handle(ContainerCheckRequest request) {
           underHealth.isUnrecoverable(), underHealth.hasHealthyReplicas());
 
       if (underHealth.isUnrecoverable()) {
-        report.incrementAndSample(ContainerHealthState.MISSING, container);
+        request.setHealthState(ContainerHealthState.MISSING);
         return true;
       }
-      report.incrementAndSample(ContainerHealthState.UNDER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.UNDER_REPLICATED);
 
       if (!underHealth.isReplicatedOkAfterPending() &&
           underHealth.hasHealthyReplicas()) {
@@ -138,7 +136,7 @@ public boolean handle(ContainerCheckRequest request) {
     */
     if (health.getHealthState()
         == ContainerHealthResult.HealthState.OVER_REPLICATED) {
-      report.incrementAndSample(ContainerHealthState.OVER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.OVER_REPLICATED);
       ContainerHealthResult.OverReplicatedHealthResult overHealth
           = ((ContainerHealthResult.OverReplicatedHealthResult) health);
       if (!overHealth.isReplicatedOkAfterPending() &&
@@ -166,7 +164,7 @@ public boolean handle(ContainerCheckRequest request) {
 
     if (health.getHealthState() ==
         ContainerHealthResult.HealthState.MIS_REPLICATED) {
-      report.incrementAndSample(ContainerHealthState.MIS_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.MIS_REPLICATED);
       ContainerHealthResult.MisReplicatedHealthResult misRepHealth
           = ((ContainerHealthResult.MisReplicatedHealthResult) health);
       if (!misRepHealth.isReplicatedOkAfterPending()) {
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisUnhealthyReplicationCheckHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisUnhealthyReplicationCheckHandler.java
index bf061bb91d9..9a2fab6ef90 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisUnhealthyReplicationCheckHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/RatisUnhealthyReplicationCheckHandler.java
@@ -22,7 +22,6 @@
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
-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.ContainerHealthResult;
 import 
org.apache.hadoop.hdds.scm.container.replication.RatisContainerReplicaCount;
@@ -52,7 +51,6 @@ public boolean handle(ContainerCheckRequest request) {
       // This handler is only for Ratis containers.
       return false;
     }
-    ReplicationManagerReport report = request.getReport();
     ContainerInfo container = request.getContainerInfo();
 
     RatisContainerReplicaCount replicaCount = getReplicaCount(request);
@@ -75,7 +73,7 @@ public boolean handle(ContainerCheckRequest request) {
       ContainerHealthResult.UnderReplicatedHealthResult underHealth
           = ((ContainerHealthResult.UnderReplicatedHealthResult) health);
       // Container is UNHEALTHY + UNDER_REPLICATED
-      
report.incrementAndSample(ContainerHealthState.UNHEALTHY_UNDER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.UNHEALTHY_UNDER_REPLICATED);
       LOG.debug("Container {} is Under Replicated. isReplicatedOkAfterPending" 
+
               " is [{}]. isUnrecoverable is [{}]. hasHealthyReplicas is [{}].",
           container,
@@ -91,7 +89,7 @@ public boolean handle(ContainerCheckRequest request) {
     if (health.getHealthState()
         == ContainerHealthResult.HealthState.OVER_REPLICATED) {
       // Container is UNHEALTHY + OVER_REPLICATED
-      
report.incrementAndSample(ContainerHealthState.UNHEALTHY_OVER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.UNHEALTHY_OVER_REPLICATED);
       ContainerHealthResult.OverReplicatedHealthResult overHealth
           = ((ContainerHealthResult.OverReplicatedHealthResult) health);
       LOG.debug("Container {} is Over Replicated. isReplicatedOkAfterPending" +
@@ -107,7 +105,7 @@ public boolean handle(ContainerCheckRequest request) {
 
     if (health.getHealthState() == 
ContainerHealthResult.HealthState.UNHEALTHY) {
       // Container is UNHEALTHY + SUFFICIENTLY REPLICATED
-      report.incrementAndSample(ContainerHealthState.UNHEALTHY, container);
+      request.setHealthState(ContainerHealthState.UNHEALTHY);
       LOG.debug("Container {} is sufficiently replicated with all unhealthy 
replicas", container);
     }
     
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/VulnerableUnhealthyReplicasHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/VulnerableUnhealthyReplicasHandler.java
index 1517b2b4d88..5a0d56e7cbf 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/VulnerableUnhealthyReplicasHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/health/VulnerableUnhealthyReplicasHandler.java
@@ -25,7 +25,6 @@
 import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
 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.ContainerHealthResult;
 import 
org.apache.hadoop.hdds.scm.container.replication.RatisContainerReplicaCount;
@@ -83,8 +82,7 @@ public boolean handle(ContainerCheckRequest request) {
 
     if (!vulnerableUnhealthy.isEmpty()) {
       LOG.info("Found vulnerable UNHEALTHY replicas {} for container {}.", 
vulnerableUnhealthy, container);
-      ReplicationManagerReport report = request.getReport();
-      
report.incrementAndSample(ContainerHealthState.UNHEALTHY_UNDER_REPLICATED, 
container);
+      request.setHealthState(ContainerHealthState.UNHEALTHY_UNDER_REPLICATED);
       if (!request.isReadOnly()) {
         ContainerHealthResult.UnderReplicatedHealthResult underRepResult =
             replicaCount.toUnderHealthResult();
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestContainerCheckRequest.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestContainerCheckRequest.java
new file mode 100644
index 00000000000..283a5be5c74
--- /dev/null
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestContainerCheckRequest.java
@@ -0,0 +1,58 @@
+/*
+ * 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;
+
+import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState.CLOSED;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Collections;
+import org.apache.hadoop.hdds.client.RatisReplicationConfig;
+import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.hdds.scm.container.ContainerHealthState;
+import org.apache.hadoop.hdds.scm.container.ContainerInfo;
+import org.apache.hadoop.hdds.scm.container.ReplicationManagerReport;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests for {@link ContainerCheckRequest}.
+ */
+public class TestContainerCheckRequest {
+
+  @Test
+  public void testSetHealthStateUpdatesBothRequestAndReport() {
+    ContainerInfo containerInfo = ReplicationTestUtil.createContainerInfo(
+        RatisReplicationConfig.getInstance(HddsProtos.ReplicationFactor.THREE),
+        1, CLOSED);
+    ReplicationManagerReport report = new ReplicationManagerReport(10);
+
+    ContainerCheckRequest request = new ContainerCheckRequest.Builder()
+        .setContainerInfo(containerInfo)
+        .setContainerReplicas(Collections.emptySet())
+        .setPendingOps(Collections.emptyList())
+        .setReport(report)
+        .build();
+
+    assertEquals(ContainerHealthState.HEALTHY, request.getHealthState());
+    assertEquals(0, report.getStat(ContainerHealthState.UNDER_REPLICATED));
+
+    request.setHealthState(ContainerHealthState.UNDER_REPLICATED);
+
+    assertEquals(ContainerHealthState.UNDER_REPLICATED, 
request.getHealthState());
+    assertEquals(1, report.getStat(ContainerHealthState.UNDER_REPLICATED));
+  }
+}
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
index 1d8738787c4..e41e9582033 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/health/TestQuasiClosedStuckReplicationCheck.java
@@ -67,7 +67,6 @@ public void setup() {
     rmConf = new 
OzoneConfiguration().getObject(ReplicationManager.ReplicationManagerConfiguration.class);
     handler = new QuasiClosedStuckReplicationCheck(rmConf);
     report = new ReplicationManagerReport(rmConf.getContainerSampleLimit());
-    report.resetContainerHealthState();  // Reset before each test
     queue = new ReplicationQueue();
   }
 


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

Reply via email to