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 827fb8180c HDDS-9747. Incorrect sorting order for all unhealthy 
replicas in RatisOverReplicationHandler (#5689)
827fb8180c is described below

commit 827fb8180ca4383ac03720314e58befcd1b60d41
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Wed Nov 29 11:54:58 2023 +0000

    HDDS-9747. Incorrect sorting order for all unhealthy replicas in 
RatisOverReplicationHandler (#5689)
---
 .../replication/RatisOverReplicationHandler.java   |  2 +-
 .../TestRatisOverReplicationHandler.java           | 41 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/RatisOverReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/RatisOverReplicationHandler.java
index 7974e72bac..a0892b28d2 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/RatisOverReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/RatisOverReplicationHandler.java
@@ -231,7 +231,7 @@ public class RatisOverReplicationHandler
       // prefer deleting replicas with lower sequence IDs
       return replicas.stream()
           .sorted(Comparator.comparingLong(ContainerReplica::getSequenceId)
-              .reversed())
+              .thenComparing(ContainerReplica::hashCode))
           .collect(Collectors.toList());
     }
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
index ec4259bac6..f69715f9b4 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestRatisOverReplicationHandler.java
@@ -44,6 +44,7 @@ import org.slf4j.event.Level;
 
 import java.io.IOException;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -236,6 +237,46 @@ public class TestRatisOverReplicationHandler {
         getOverReplicatedHealthResult(), 0);
   }
 
+  @Test
+  public void testOverReplicatedAllUnhealthySameBCSID()
+      throws IOException {
+    Set<ContainerReplica> replicas = createReplicas(container.containerID(),
+        ContainerReplicaProto.State.UNHEALTHY, 0, 0, 0, 0);
+
+    ContainerReplica shouldDelete = replicas.stream()
+        .sorted(Comparator.comparingLong(ContainerReplica::hashCode))
+        .findFirst().get();
+
+    Set<Pair<DatanodeDetails, SCMCommand<?>>> commands =
+        testProcessing(replicas, Collections.emptyList(),
+        getOverReplicatedHealthResult(), 1);
+    Pair<DatanodeDetails, SCMCommand<?>> commandPair
+        = commands.iterator().next();
+    assertEquals(shouldDelete.getDatanodeDetails(),
+        commandPair.getKey());
+  }
+
+  @Test
+  public void testOverReplicatedAllUnhealthyPicksLowestBCSID()
+      throws IOException {
+    final long sequenceID = 20;
+    Set<ContainerReplica> replicas = new HashSet<>();
+    ContainerReplica lowestSequenceIDReplica = createContainerReplica(
+        container.containerID(), 0, IN_SERVICE, State.UNHEALTHY, sequenceID);
+    replicas.add(lowestSequenceIDReplica);
+    for (int i = 1; i < 4; i++) {
+      replicas.add(createContainerReplica(container.containerID(), 0,
+          IN_SERVICE, State.UNHEALTHY, sequenceID + i));
+    }
+    Set<Pair<DatanodeDetails, SCMCommand<?>>> commands =
+        testProcessing(replicas, Collections.emptyList(),
+            getOverReplicatedHealthResult(), 1);
+    Pair<DatanodeDetails, SCMCommand<?>> commandPair
+        = commands.iterator().next();
+    assertEquals(lowestSequenceIDReplica.getDatanodeDetails(),
+        commandPair.getKey());
+  }
+
   /**
    * Closed container with 4 closed replicas and 1 quasi closed replica. This
    * container is over replicated and the handler should create a delete


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

Reply via email to