You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by so...@apache.org on 2023/04/11 10:48:11 UTC

[ozone] branch master updated: HDDS-8351. ReplicationManager: Use RM exclude list when getting target nodes for reconstruction (#4520)

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

sodonnell 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 6326fd5cb8 HDDS-8351. ReplicationManager: Use RM exclude list when getting target nodes for reconstruction (#4520)
6326fd5cb8 is described below

commit 6326fd5cb8b77dc2134e929ea62c3e8f62b5533f
Author: Doroszlai, Attila <64...@users.noreply.github.com>
AuthorDate: Tue Apr 11 12:48:03 2023 +0200

    HDDS-8351. ReplicationManager: Use RM exclude list when getting target nodes for reconstruction (#4520)
---
 .../replication/ECUnderReplicationHandler.java     |  1 +
 .../replication/TestECUnderReplicationHandler.java | 36 ++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
index 3c13dfe6b6..af57775fd6 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ECUnderReplicationHandler.java
@@ -141,6 +141,7 @@ public class ECUnderReplicationHandler implements UnhealthyReplicationHandler {
             ContainerReplicaOp.PendingOpType.ADD)
         .map(ContainerReplicaOp::getTarget)
         .collect(Collectors.toList()));
+    excludedNodes.addAll(replicationManager.getExcludedNodes());
 
     final ContainerID id = container.containerID();
     int commandsSent = 0;
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
index 6ea963ab14..b42add9ecf 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestECUnderReplicationHandler.java
@@ -48,6 +48,7 @@ import org.junit.Assert;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
 import java.io.IOException;
@@ -59,6 +60,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static java.util.Collections.singleton;
 import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.DECOMMISSIONING;
 import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.ENTERING_MAINTENANCE;
 import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState.IN_MAINTENANCE;
@@ -138,6 +140,40 @@ public class TestECUnderReplicationHandler {
         .thenReturn(new ContainerPlacementStatusDefault(2, 2, 3));
   }
 
+  @Test
+  void excludesOverloadedNodes() throws IOException {
+    ECUnderReplicationHandler subject = new ECUnderReplicationHandler(
+        ecPlacementPolicy, conf, replicationManager);
+    Set<ContainerReplica> replicas = ReplicationTestUtil
+        .createReplicas(Pair.of(IN_SERVICE, 1), Pair.of(IN_SERVICE, 2),
+            Pair.of(IN_SERVICE, 3));
+    ContainerHealthResult.UnderReplicatedHealthResult result =
+        Mockito.mock(ContainerHealthResult.UnderReplicatedHealthResult.class);
+    Mockito.when(result.getContainerInfo()).thenReturn(container);
+
+    DatanodeDetails excludedByRM = MockDatanodeDetails.randomDatanodeDetails();
+    Mockito.when(replicationManager.getExcludedNodes())
+        .thenReturn(singleton(excludedByRM));
+
+    ArgumentCaptor<List<DatanodeDetails>> captor =
+        ArgumentCaptor.forClass(List.class);
+    Mockito.when(ecPlacementPolicy.chooseDatanodes(captor.capture(),
+            any(), anyInt(), anyLong(), anyLong())
+        ).thenAnswer(invocationOnMock -> {
+          int numNodes = invocationOnMock.getArgument(2);
+          List<DatanodeDetails> targets = new ArrayList<>();
+          for (int i = 0; i < numNodes; i++) {
+            targets.add(MockDatanodeDetails.randomDatanodeDetails());
+          }
+          return targets;
+        });
+
+    subject.processAndSendCommands(
+        replicas, Collections.emptyList(), result, 2);
+
+    Assertions.assertTrue(captor.getValue().contains(excludedByRM));
+  }
+
   @Test
   public void testUnderReplicationWithMissingParityIndex5() throws IOException {
     Set<ContainerReplica> availableReplicas = ReplicationTestUtil


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org