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

sammichen 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 2d57e9f  HDDS-5708. Skip sending container close command to unhealthy 
replica. (#2610)
2d57e9f is described below

commit 2d57e9fff0287516c8af9e250f39197dcf998977
Author: Sammi Chen <[email protected]>
AuthorDate: Tue Sep 14 12:35:15 2021 +0800

    HDDS-5708. Skip sending container close command to unhealthy replica. 
(#2610)
---
 .../hdds/scm/container/ReplicationManager.java     |  8 ++++++--
 .../hdds/scm/container/TestReplicationManager.java | 24 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java
index 90bbd97..68a8fa7 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java
@@ -426,8 +426,12 @@ public class ReplicationManager implements SCMService {
          * we have to resend close container command to the datanodes.
          */
         if (state == LifeCycleState.CLOSING) {
-          replicas.forEach(replica -> sendCloseCommand(
-              container, replica.getDatanodeDetails(), false));
+          for (ContainerReplica replica: replicas) {
+            if (replica.getState() != State.UNHEALTHY) {
+              sendCloseCommand(
+                  container, replica.getDatanodeDetails(), false);
+            }
+          }
           return;
         }
 
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestReplicationManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestReplicationManager.java
index 631ab2b..2d84a5a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestReplicationManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestReplicationManager.java
@@ -827,6 +827,30 @@ public class TestReplicationManager {
         .onMessage(id, eventQueue);
   }
 
+  /**
+   * ReplicationManager should skip send close command to unhealthy replica.
+   */
+  @Test
+  public void testCloseUnhealthyReplica()
+      throws SCMException, ContainerNotFoundException, InterruptedException {
+    final ContainerInfo container = getContainer(LifeCycleState.CLOSING);
+    final ContainerID id = container.containerID();
+    final Set<ContainerReplica> replicas = getReplicas(id, State.UNHEALTHY,
+        randomDatanodeDetails());
+    replicas.addAll(getReplicas(id, State.OPEN, randomDatanodeDetails()));
+    replicas.addAll(getReplicas(id, State.OPEN, randomDatanodeDetails()));
+
+    containerStateManager.loadContainer(container);
+    for (ContainerReplica replica : replicas) {
+      containerStateManager.updateContainerReplica(id, replica);
+    }
+
+    replicationManager.processAll();
+    // Wait for EventQueue to call the event handler
+    eventQueue.processAll(1000);
+    Assert.assertEquals(2, datanodeCommandHandler.getInvocation());
+  }
+
   @Test
   public void testGeneratedConfig() {
     ReplicationManagerConfiguration rmc =

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

Reply via email to