소스 검색

HDDS-1850. ReplicationManager should consider inflight replication and deletion while picking datanode for re-replication.

Signed-off-by: Anu Engineer <aengineer@apache.org>
(cherry picked from commit 2b1d8aedbb669cf412465bf7a5762c8aeda52faa)
Nanda kumar 5 년 전
부모
커밋
9a5ebecf04
1개의 변경된 파일7개의 추가작업 그리고 1개의 파일을 삭제
  1. 7 1
      hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java

+ 7 - 1
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ReplicationManager.java

@@ -483,8 +483,14 @@ public class ReplicationManager {
         final int replicationFactor = container
             .getReplicationFactor().getNumber();
         final int delta = replicationFactor - getReplicaCount(id, replicas);
+        final List<DatanodeDetails> excludeList = replicas.stream()
+            .map(ContainerReplica::getDatanodeDetails)
+            .collect(Collectors.toList());
+        inflightReplication.get(id).stream().map(r -> r.datanode)
+            .forEach(excludeList::add);
         final List<DatanodeDetails> selectedDatanodes = containerPlacement
-            .chooseDatanodes(source, null, delta, container.getUsedBytes());
+            .chooseDatanodes(excludeList, null, delta,
+                container.getUsedBytes());
 
         LOG.info("Container {} is under replicated. Expected replica count" +
                 " is {}, but found {}.", id, replicationFactor,