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