Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,20 @@
import com.google.common.collect.ImmutableSet;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.hdds.client.ECReplicationConfig;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.MockDatanodeDetails;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.container.ContainerReplica;
import org.apache.hadoop.hdds.scm.container.ECContainerReplicaCount;
import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaOp;
import org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
import org.apache.hadoop.hdds.scm.container.replication.ReplicationTestUtil;
import org.apache.hadoop.ozone.common.MonotonicClock;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand All @@ -55,9 +52,6 @@ public class TestECContainerReplicaCount {

private ECReplicationConfig repConfig;
private ContainerInfo container;
private ContainerReplicaPendingOps emptyPendingOps =
new ContainerReplicaPendingOps(new OzoneConfiguration(),
new MonotonicClock(ZoneOffset.UTC));

@BeforeEach
public void setup() {
Expand All @@ -74,7 +68,7 @@ public void testPerfectlyReplicatedContainer() {
Pair.of(IN_SERVICE, 5));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertTrue(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.unRecoverable());
}
Expand All @@ -86,7 +80,7 @@ public void testContainerMissingReplica() {
Pair.of(IN_SERVICE, 3), Pair.of(IN_SERVICE, 4));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
Assertions.assertEquals(1, rcnt.unavailableIndexes(true).size());
Assertions.assertEquals(5,
Expand Down Expand Up @@ -152,18 +146,14 @@ public void testContainerWithMaintenanceReplicasSufficientlyReplicated() {
Pair.of(IN_MAINTENANCE, 5));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 0);
Collections.emptyList(), 0);
Assertions.assertTrue(rcnt.isSufficientlyReplicated(false));
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
ContainerReplicaPendingOps pendingOps =
new ContainerReplicaPendingOps(new OzoneConfiguration(),
new MonotonicClock(ZoneOffset.UTC));
pendingOps.scheduleDeleteReplica(container.containerID(),
MockDatanodeDetails.randomDatanodeDetails(), 1);
rcnt = new ECContainerReplicaCount(container, replica,
pendingOps.getPendingOps(container.containerID()), 0);
List<ContainerReplicaOp> pendingOps =
getContainerReplicaOps(ImmutableList.of(), ImmutableList.of(1));
rcnt = new ECContainerReplicaCount(container, replica, pendingOps, 0);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
}

Expand Down Expand Up @@ -239,7 +229,7 @@ public void testAdditionalMaintenanceCopiesAllMaintenance() {
Pair.of(IN_MAINTENANCE, 1));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(4, rcnt.additionalMaintenanceCopiesNeeded());
Expand All @@ -256,7 +246,7 @@ public void testAdditionalMaintenanceCopiesAlreadyReplicated() {
Pair.of(IN_MAINTENANCE, 5), Pair.of(IN_MAINTENANCE, 1));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertTrue(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(0, rcnt.additionalMaintenanceCopiesNeeded());
Expand All @@ -267,7 +257,7 @@ public void testAdditionalMaintenanceCopiesAlreadyReplicated() {
// Repeat the test with redundancy of 2. Once the maintenance copies go
// offline, we should be able to lost 2 more containers.
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 2);
Collections.emptyList(), 2);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(1, rcnt.additionalMaintenanceCopiesNeeded());
Expand Down Expand Up @@ -308,7 +298,7 @@ public void testAdditionalMaintenanceCopiesDuplicatesInMaintenance() {
Pair.of(IN_MAINTENANCE, 1), Pair.of(IN_MAINTENANCE, 5));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertTrue(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(0, rcnt.additionalMaintenanceCopiesNeeded());
Expand All @@ -319,7 +309,7 @@ public void testAdditionalMaintenanceCopiesDuplicatesInMaintenance() {
// Repeat the test with redundancy of 2. Once the maintenance copies go
// offline, we should be able to lost 2 more containers.
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 2);
Collections.emptyList(), 2);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(1, rcnt.additionalMaintenanceCopiesNeeded());
Expand All @@ -337,7 +327,7 @@ public void testMaintenanceRedundancyGreaterThanParity() {
Pair.of(IN_MAINTENANCE, 5));
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 5);
Collections.emptyList(), 5);
// EC Parity is 2, which is max redundancy, but we have a
// maintenanceRedundancy of 5, which is not possible. Only 2 more copies
// should be needed.
Expand All @@ -349,7 +339,7 @@ public void testMaintenanceRedundancyGreaterThanParity() {
Pair.of(IN_MAINTENANCE, 5), Pair.of(IN_SERVICE, 4),
Pair.of(IN_SERVICE, 5));
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 5);
Collections.emptyList(), 5);
Assertions.assertEquals(0, rcnt.additionalMaintenanceCopiesNeeded());

}
Expand All @@ -362,7 +352,7 @@ public void testUnderReplicatedNoMaintenance() {

ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertFalse(rcnt.isSufficientlyReplicated(false));
Assertions.assertFalse(rcnt.isOverReplicated(true));
Assertions.assertEquals(0, rcnt.additionalMaintenanceCopiesNeeded());
Expand Down Expand Up @@ -476,14 +466,14 @@ private List<ContainerReplicaOp> getContainerReplicaOps(
public void testMissing() {
ECContainerReplicaCount rcnt =
new ECContainerReplicaCount(container, new HashSet<>(),
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertTrue(rcnt.unRecoverable());
Assertions.assertEquals(5, rcnt.unavailableIndexes(true).size());

Set<ContainerReplica> replica = ReplicationTestUtil
.createReplicas(Pair.of(IN_SERVICE, 1), Pair.of(IN_MAINTENANCE, 2));
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
Assertions.assertTrue(rcnt.unRecoverable());
Assertions.assertEquals(3, rcnt.unavailableIndexes(true).size());
Assertions.assertEquals(0, rcnt.additionalMaintenanceCopiesNeeded());
Expand All @@ -493,7 +483,7 @@ public void testMissing() {
Pair.of(DECOMMISSIONED, 3), Pair.of(DECOMMISSIONED, 4),
Pair.of(DECOMMISSIONED, 5));
rcnt = new ECContainerReplicaCount(container, replica,
emptyPendingOps.getPendingOps(container.containerID()), 1);
Collections.emptyList(), 1);
// Not missing as the decommission replicas are still online
Assertions.assertFalse(rcnt.unRecoverable());
Assertions.assertEquals(0, rcnt.unavailableIndexes(true).size());
Expand Down