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 6b1e2afc52b..d2899fae223 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 @@ -624,17 +624,20 @@ private void handleOverReplicatedContainer(final ContainerInfo container, " is {}, but found {}.", id, replicationFactor, replicationFactor + excess); + final List eligibleReplicas = new ArrayList<>(replicas); + final Map uniqueReplicas = new LinkedHashMap<>(); - replicas.stream() - .filter(r -> compareState(container.getState(), r.getState())) - .forEach(r -> uniqueReplicas - .putIfAbsent(r.getOriginDatanodeId(), r)); + if (container.getState() != LifeCycleState.CLOSED) { + replicas.stream() + .filter(r -> compareState(container.getState(), r.getState())) + .forEach(r -> uniqueReplicas + .putIfAbsent(r.getOriginDatanodeId(), r)); - // Retain one healthy replica per origin node Id. - final List eligibleReplicas = new ArrayList<>(replicas); - eligibleReplicas.removeAll(uniqueReplicas.values()); + // Retain one healthy replica per origin node Id. + eligibleReplicas.removeAll(uniqueReplicas.values()); + } final List unhealthyReplicas = eligibleReplicas .stream() 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 b1e27c0816e..b11582ab186 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 @@ -817,7 +817,7 @@ public void testOverReplicatedAndPolicyUnSatisfiedAndDeleted() throws final ContainerReplica replicaFour = getReplicas( id, State.CLOSED, 1000L, originNodeId, randomDatanodeDetails()); final ContainerReplica replicaFive = getReplicas( - id, State.CLOSED, 1000L, originNodeId, randomDatanodeDetails()); + id, State.QUASI_CLOSED, 1000L, originNodeId, randomDatanodeDetails()); containerStateManager.loadContainer(container); containerStateManager.updateContainerReplica(id, replicaOne);