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 b6ad97fd52 HDDS-7962. Add configuration flag to enable
LegacyReplicationManager for RATIS containers (#4270)
b6ad97fd52 is described below
commit b6ad97fd521876f7196c3ffeac9d7b052deb63e8
Author: Siddhant Sangwan <[email protected]>
AuthorDate: Wed Feb 15 14:32:23 2023 +0530
HDDS-7962. Add configuration flag to enable LegacyReplicationManager for
RATIS containers (#4270)
---
.../container/replication/ReplicationManager.java | 59 +++++++++++++++++++---
.../ozone/container/TestContainerReplication.java | 50 +++++++++++++++---
2 files changed, 94 insertions(+), 15 deletions(-)
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 e9f478e92c..eac093320f 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
@@ -265,7 +265,9 @@ public class ReplicationManager implements SCMService {
LOG.info("Starting Replication Monitor Thread.");
running = true;
metrics = ReplicationManagerMetrics.create(this);
- legacyReplicationManager.setMetrics(metrics);
+ if (rmConf.isLegacyEnabled()) {
+ legacyReplicationManager.setMetrics(metrics);
+ }
containerReplicaPendingOps.setReplicationMetrics(metrics);
startSubServices();
} else {
@@ -297,7 +299,9 @@ public class ReplicationManager implements SCMService {
underReplicatedProcessorThread.interrupt();
overReplicatedProcessorThread.interrupt();
running = false;
- legacyReplicationManager.clearInflightActions();
+ if (rmConf.isLegacyEnabled()) {
+ legacyReplicationManager.clearInflightActions();
+ }
metrics.unRegister();
replicationMonitor.interrupt();
} else {
@@ -347,7 +351,7 @@ public class ReplicationManager implements SCMService {
break;
}
report.increment(c.getState());
- if (c.getReplicationType() != EC) {
+ if (c.getReplicationType() != EC && rmConf.isLegacyEnabled()) {
legacyReplicationManager.processContainer(c, report);
continue;
}
@@ -757,7 +761,12 @@ public class ReplicationManager implements SCMService {
if (container.getReplicationType() == EC) {
return getECContainerReplicaCount(container);
}
- return legacyReplicationManager.getContainerReplicaCount(container);
+
+ if (rmConf.isLegacyEnabled()) {
+ return legacyReplicationManager.getContainerReplicaCount(container);
+ } else {
+ return getRatisContainerReplicaCount(container);
+ }
}
/**
@@ -803,6 +812,30 @@ public class ReplicationManager implements SCMService {
*/
@ConfigGroup(prefix = "hdds.scm.replication")
public static class ReplicationManagerConfiguration {
+ /**
+ * True if LegacyReplicationManager should be used for RATIS containers.
+ */
+ @Config(key = "enable.legacy",
+ type = ConfigType.BOOLEAN,
+ defaultValue = "true",
+ tags = {SCM, OZONE},
+ description = "This configuration decides if " +
+ "LegacyReplicationManager should be used to handle RATIS " +
+ "containers. Default is true, which means " +
+ "LegacyReplicationManager will handle RATIS containers while " +
+ "ReplicationManager will handle EC containers. If false, " +
+ "ReplicationManager will handle both RATIS and EC."
+ )
+ private boolean enableLegacy = true;
+
+ public boolean isLegacyEnabled() {
+ return enableLegacy;
+ }
+
+ public void setEnableLegacy(boolean enableLegacy) {
+ this.enableLegacy = enableLegacy;
+ }
+
/**
* The frequency in which ReplicationMonitor thread should run.
*/
@@ -1004,9 +1037,11 @@ public class ReplicationManager implements SCMService {
lastTimeToBeReadyInMillis = clock.millis();
serviceStatus = ServiceStatus.RUNNING;
}
- //now, as the current scm is leader and it`s state is up-to-date,
- //we need to take some action about replicated inflight move options.
- legacyReplicationManager.notifyStatusChanged();
+ if (rmConf.isLegacyEnabled()) {
+ //now, as the current scm is leader and it`s state is up-to-date,
+ //we need to take some action about replicated inflight move options.
+ legacyReplicationManager.notifyStatusChanged();
+ }
} else {
serviceStatus = ServiceStatus.PAUSING;
}
@@ -1087,6 +1122,16 @@ public class ReplicationManager implements SCMService {
return new ECContainerReplicaCount(
containerInfo, replicas, pendingOps, maintenanceRedundancy);
}
+
+ private RatisContainerReplicaCount getRatisContainerReplicaCount(
+ ContainerInfo containerInfo) throws ContainerNotFoundException {
+ Set<ContainerReplica> replicas =
+ containerManager.getContainerReplicas(containerInfo.containerID());
+ List<ContainerReplicaOp> pendingOps =
+ containerReplicaPendingOps.getPendingOps(containerInfo.containerID());
+ return new RatisContainerReplicaCount(containerInfo, replicas, pendingOps,
+ ratisMaintenanceMinReplicas, false);
+ }
public ContainerReplicaPendingOps getContainerReplicaPendingOps() {
return containerReplicaPendingOps;
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java
index 6d49f46092..09fb6a2d70 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/TestContainerReplication.java
@@ -101,14 +101,6 @@ public class TestContainerReplication {
Level.DEBUG);
GenericTestUtils.setLogLevel(SCMContainerPlacementRackAware.LOG,
Level.DEBUG);
- OzoneConfiguration conf = createConfiguration();
- conf.set(OZONE_SCM_CONTAINER_PLACEMENT_IMPL_KEY, placementPolicyClass);
-
- cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
- cluster.waitForClusterToBeReady();
-
- client = OzoneClientFactory.getRpcClient(conf);
- createTestData();
}
@After
@@ -120,6 +112,47 @@ public class TestContainerReplication {
@Test
public void testContainerReplication() throws Exception {
+ OzoneConfiguration conf = createConfiguration();
+ conf.set(OZONE_SCM_CONTAINER_PLACEMENT_IMPL_KEY, placementPolicyClass);
+ cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
+ cluster.waitForClusterToBeReady();
+ client = OzoneClientFactory.getRpcClient(conf);
+ createTestData();
+
+ List<OmKeyLocationInfo> keyLocations = lookupKey(cluster);
+ assertFalse(keyLocations.isEmpty());
+
+ OmKeyLocationInfo keyLocation = keyLocations.get(0);
+ long containerID = keyLocation.getContainerID();
+ waitForContainerClose(cluster, containerID);
+
+ cluster.shutdownHddsDatanode(keyLocation.getPipeline().getFirstNode());
+ waitForReplicaCount(containerID, 2, cluster);
+
+ waitForReplicaCount(containerID, 3, cluster);
+ }
+
+ @Test
+ public void testContainerReplicationWithLegacyReplicationManagerDisabled()
+ throws Exception {
+ OzoneConfiguration conf = createConfiguration();
+
+ /*
+ Disable LegacyReplicationManager so that ReplicationManager handles Ratis
+ containers.
+ */
+ ReplicationManagerConfiguration repConf =
+ conf.getObject(ReplicationManagerConfiguration.class);
+ repConf.setEnableLegacy(false);
+ repConf.setUnderReplicatedInterval(Duration.ofSeconds(1));
+ conf.setFromObject(repConf);
+
+ conf.set(OZONE_SCM_CONTAINER_PLACEMENT_IMPL_KEY, placementPolicyClass);
+ cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(5).build();
+ cluster.waitForClusterToBeReady();
+ client = OzoneClientFactory.getRpcClient(conf);
+ createTestData();
+
List<OmKeyLocationInfo> keyLocations = lookupKey(cluster);
assertFalse(keyLocations.isEmpty());
@@ -128,6 +161,7 @@ public class TestContainerReplication {
waitForContainerClose(cluster, containerID);
cluster.shutdownHddsDatanode(keyLocation.getPipeline().getFirstNode());
+ waitForReplicaCount(containerID, 2, cluster);
waitForReplicaCount(containerID, 3, cluster);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]