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

sumitagrawl 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 68be47bb230 HDDS-15498. optimize Container Safemode refresh to use 
DELETED state (#10462)
68be47bb230 is described below

commit 68be47bb23009cb341e535818eb682166f293e20
Author: Sumit Agrawal <[email protected]>
AuthorDate: Tue Jun 9 16:21:51 2026 +0530

    HDDS-15498. optimize Container Safemode refresh to use DELETED state 
(#10462)
---
 .../hdds/scm/safemode/AbstractContainerSafeModeRule.java      | 11 ++---------
 .../hdds/scm/safemode/AbstractContainerSafeModeRuleTest.java  |  7 ++++++-
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRule.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRule.java
index 9d13f951978..fd229654d78 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRule.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRule.java
@@ -24,7 +24,6 @@
 import com.google.common.base.Preconditions;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -92,14 +91,8 @@ protected void reinitializeRule() {
     // Since ContainerSafeModeRule is updated with container list notified 
during DN registration only,
     // So its not required to add newly created container after DN 
registration.
     int oldContainerCount = containers.size();
-    Set<ContainerID> containerInfoSet = 
containerManager.getContainers(getContainerType()).stream()
-        .filter(this::isClosed)
-        .filter(c -> c.getNumberOfKeys() > 0)
-        .filter(c -> 
containers.containsKey(ContainerID.valueOf(c.getContainerID())))
-        .map(c -> ContainerID.valueOf(c.getContainerID()))
-        .collect(Collectors.toSet());
-    // remove deleted containers from containers list
-    containers.keySet().removeIf(c -> !containerInfoSet.contains(c));
+    List<ContainerInfo> deletedContainers = 
containerManager.getContainers(LifeCycleState.DELETED);
+    deletedContainers.forEach(info -> 
containers.remove(ContainerID.valueOf(info.getContainerID())));
     // update new total with reducing removed containers
     totalContainers.set(totalContainers.get() - (oldContainerCount - 
containers.size()));
     final long cutOff = (long) Math.ceil(getTotalNumberOfContainers() * 
getSafeModeCutoff());
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRuleTest.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRuleTest.java
index 7f3fd432803..229db2443e4 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRuleTest.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/safemode/AbstractContainerSafeModeRuleTest.java
@@ -55,6 +55,7 @@
  * Abstract base class for container safe mode rule tests.
  */
 public abstract class AbstractContainerSafeModeRuleTest {
+  private final List<ContainerInfo> deletedContainers = new ArrayList<>();
   private List<ContainerInfo> containers;
   private SCMSafeModeManager safeModeManager;
   private ConfigurationSource conf;
@@ -74,6 +75,7 @@ public void setup() throws ContainerNotFoundException {
     when(safeModeManager.getSafeModeMetrics()).thenReturn(safeModeMetrics);
     containers = new ArrayList<>();
     
when(containerManager.getContainers(getReplicationType())).thenReturn(containers);
+    
when(containerManager.getContainers(LifeCycleState.DELETED)).thenReturn(deletedContainers);
     
when(containerManager.getContainer(any(ContainerID.class))).thenAnswer(invocation
 -> {
       ContainerID id = invocation.getArgument(0);
       return containers.stream()
@@ -98,7 +100,7 @@ public void testRefreshInitializeContainers() {
     containers.add(mockContainer(LifeCycleState.OPEN, 3L));
     containers.add(mockContainer(LifeCycleState.CLOSED, 4L));
     containers.removeIf(c -> c.containerID().equals(ContainerID.valueOf(8L)));
-    containers.add(mockContainer(LifeCycleState.DELETED, 8L));
+    deletedContainers.add(mockContainer(LifeCycleState.DELETED, 8L));
     rule.refresh(true);
 
     assertEquals(0.0, rule.getCurrentContainerThreshold());
@@ -110,6 +112,9 @@ public void testRefreshInitializeContainers() {
       names = {"OPEN", "CLOSING", "QUASI_CLOSED", "CLOSED", "DELETING", 
"DELETED", "RECOVERING"})
   public void testValidateReturnsTrueAndFalse(LifeCycleState state) {
     containers.add(mockContainer(state, 1L));
+    if (state == LifeCycleState.DELETED) {
+      deletedContainers.add(mockContainer(state, 1L));
+    }
     AbstractContainerSafeModeRule rule = createRule(eventQueue, conf, 
containerManager, safeModeManager);
     rule.setValidateBasedOnReportProcessing(false);
 


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

Reply via email to