diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java index 62851a325b15..b33f0ef352a7 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManager.java @@ -994,14 +994,16 @@ public ContainerReplicaCount getContainerReplicaCount(ContainerID containerID) */ public ContainerHealthResult getContainerReplicationHealth( ContainerInfo containerInfo, Set replicas) { - ContainerCheckRequest request = new ContainerCheckRequest.Builder() + ContainerCheckRequest.Builder request = new ContainerCheckRequest.Builder() .setContainerInfo(containerInfo) .setContainerReplicas(replicas) - .build(); + .setPendingOps(getPendingReplicationOps(containerInfo.containerID())); if (containerInfo.getReplicationConfig().getReplicationType() == EC) { - return ecReplicationCheckHandler.checkHealth(request); + request.setMaintenanceRedundancy(maintenanceRedundancy); + return ecReplicationCheckHandler.checkHealth(request.build()); } else { - return ratisReplicationCheckHandler.checkHealth(request); + request.setMaintenanceRedundancy(ratisMaintenanceMinReplicas); + return ratisReplicationCheckHandler.checkHealth(request.build()); } } diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java index 0e6ab3c17a09..c0221681abd8 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/replication/TestReplicationManager.java @@ -404,6 +404,37 @@ public void testUnderReplicatedContainer() throws ContainerNotFoundException { ReplicationManagerReport.HealthState.UNDER_REPLICATED)); } + /** + * {@link + * ReplicationManager#getContainerReplicationHealth(ContainerInfo, Set)} + * should return under replicated result for an under replicated container. + */ + @Test + public void testGetContainerReplicationHealthForUnderReplicatedContainer() { + ContainerInfo container = createContainerInfo(repConfig, 1, + HddsProtos.LifeCycleState.CLOSED); + Set replicas = + addReplicas(container, ContainerReplicaProto.State.CLOSED, 1, 2, 3, 4); + + ContainerHealthResult result = + replicationManager.getContainerReplicationHealth(container, replicas); + Assert.assertEquals(ContainerHealthResult.HealthState.UNDER_REPLICATED, + result.getHealthState()); + + // Test the same for a RATIS container + RatisReplicationConfig ratisRepConfig = + RatisReplicationConfig.getInstance(THREE); + container = createContainerInfo(ratisRepConfig, 1L, + HddsProtos.LifeCycleState.CLOSED); + replicas = addReplicas(container, ContainerReplicaProto.State.CLOSED, 0, + 0); + + result = + replicationManager.getContainerReplicationHealth(container, replicas); + Assert.assertEquals(ContainerHealthResult.HealthState.UNDER_REPLICATED, + result.getHealthState()); + } + @Test public void testUnderReplicatedContainerFixedByPending() throws ContainerNotFoundException {