This is an automated email from the ASF dual-hosted git repository.

adoroszlai 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 4559ef4956 HDDS-8931. Allow EC PipelineChoosingPolicy to be defined 
separately from Ratis (#4983)
4559ef4956 is described below

commit 4559ef4956cc24eb3a049cf9664322b140e6853a
Author: Stephen O'Donnell <[email protected]>
AuthorDate: Tue Jun 27 12:58:30 2023 +0100

    HDDS-8931. Allow EC PipelineChoosingPolicy to be defined separately from 
Ratis (#4983)
---
 .../java/org/apache/hadoop/hdds/scm/ScmConfig.java | 25 ++++++++-
 .../scm/pipeline/WritableContainerFactory.java     |  2 +-
 .../algorithms/PipelineChoosePolicyFactory.java    | 29 +++++-----
 .../hdds/scm/server/StorageContainerManager.java   | 11 +++-
 .../TestPipelineChoosePolicyFactory.java           | 61 +++++++++++++++++++---
 5 files changed, 106 insertions(+), 22 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfig.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfig.java
index 213b936b57..c05b0ff664 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfig.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfig.java
@@ -71,12 +71,27 @@ public class ScmConfig {
           "The full name of class which implements "
           + "org.apache.hadoop.hdds.scm.PipelineChoosePolicy. "
           + "The class decides which pipeline will be used to find or "
-          + "allocate container. If not set, "
+          + "allocate Ratis containers. If not set, "
           + "org.apache.hadoop.hdds.scm.pipeline.choose.algorithms. "
           + "RandomPipelineChoosePolicy will be used as default value."
   )
   private String pipelineChoosePolicyName;
 
+  @Config(key = "ec.pipeline.choose.policy.impl",
+      type = ConfigType.STRING,
+      defaultValue = "org.apache.hadoop.hdds.scm.pipeline.choose.algorithms" +
+          ".RandomPipelineChoosePolicy",
+      tags = { ConfigTag.SCM, ConfigTag.PIPELINE },
+      description =
+          "The full name of class which implements "
+              + "org.apache.hadoop.hdds.scm.PipelineChoosePolicy. "
+              + "The class decides which pipeline will be used when "
+              + "selecting an EC Pipeline. If not set, "
+              + "org.apache.hadoop.hdds.scm.pipeline.choose.algorithms. "
+              + "RandomPipelineChoosePolicy will be used as default value."
+  )
+  private String ecPipelineChoosePolicyName;
+
   @Config(key = "block.deletion.per-interval.max",
       type = ConfigType.INT,
       defaultValue = "100000",
@@ -138,6 +153,10 @@ public class ScmConfig {
     this.pipelineChoosePolicyName = pipelineChoosePolicyName;
   }
 
+  public void setECPipelineChoosePolicyName(String policyName) {
+    this.ecPipelineChoosePolicyName = policyName;
+  }
+
   public void setBlockDeletionLimit(int blockDeletionLimit) {
     this.blockDeletionLimit = blockDeletionLimit;
   }
@@ -158,6 +177,10 @@ public class ScmConfig {
     return pipelineChoosePolicyName;
   }
 
+  public String getECPipelineChoosePolicyName() {
+    return ecPipelineChoosePolicyName;
+  }
+
   public int getBlockDeletionLimit() {
     return blockDeletionLimit;
   }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/WritableContainerFactory.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/WritableContainerFactory.java
index b8eae8b6d1..8c8c9c29bb 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/WritableContainerFactory.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/WritableContainerFactory.java
@@ -57,7 +57,7 @@ public class WritableContainerFactory {
         scm.getScmNodeManager(),
         scm.getPipelineManager(),
         scm.getContainerManager(),
-        scm.getPipelineChoosePolicy());
+        scm.getEcPipelineChoosePolicy());
   }
 
   public ContainerInfo getContainer(final long size,
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
index f868522b17..d040dbe2bc 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
@@ -19,7 +19,6 @@
 package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.hadoop.hdds.conf.ConfigurationSource;
 import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
 import org.apache.hadoop.hdds.scm.ScmConfig;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
@@ -41,25 +40,31 @@ public final class PipelineChoosePolicyFactory {
       OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT =
       RandomPipelineChoosePolicy.class;
 
+  @VisibleForTesting
+  public static final Class<? extends PipelineChoosePolicy>
+      OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT =
+      RandomPipelineChoosePolicy.class;
+
   private PipelineChoosePolicyFactory() {
   }
 
   public static PipelineChoosePolicy getPolicy(
-      ConfigurationSource conf) throws SCMException {
-    ScmConfig scmConfig = conf.getObject(ScmConfig.class);
-    Class<? extends PipelineChoosePolicy> policyClass = getClass(
-        scmConfig.getPipelineChoosePolicyName(), PipelineChoosePolicy.class);
-
+      ScmConfig scmConfig, boolean forEC) throws SCMException {
+    Class<? extends PipelineChoosePolicy> policyClass = null;
+    String policyName = forEC ? scmConfig.getECPipelineChoosePolicyName() :
+        scmConfig.getPipelineChoosePolicyName();
     try {
+      policyClass = getClass(policyName, PipelineChoosePolicy.class);
       return createPipelineChoosePolicyFromClass(policyClass);
     } catch (Exception e) {
-      if (policyClass != OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT) {
+      Class<? extends PipelineChoosePolicy> defaultPolicy = forEC ?
+          OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT :
+          OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT;
+      if (policyClass == null || policyClass != defaultPolicy) {
         LOG.error("Met an exception while create pipeline choose policy "
-            + "for the given class " + policyClass.getName()
-            + ". Fallback to the default pipeline choose policy "
-            + OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT, e);
-        return createPipelineChoosePolicyFromClass(
-            OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT);
+            + "for the given class {}. Fallback to the default pipeline "
+            + " choose policy {}", policyName, defaultPolicy, e);
+        return createPipelineChoosePolicyFromClass(defaultPolicy);
       }
       throw e;
     }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
index 79b982cb00..b3985c854f 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
@@ -301,6 +301,7 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
    */
   private NetworkTopology clusterMap;
   private PipelineChoosePolicy pipelineChoosePolicy;
+  private PipelineChoosePolicy ecPipelineChoosePolicy;
   private SecurityConfig securityConfig;
 
   private final SCMHANodeDetails scmHANodeDetails;
@@ -767,7 +768,11 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
           containerReplicaPendingOps);
     }
 
-    pipelineChoosePolicy = PipelineChoosePolicyFactory.getPolicy(conf);
+    ScmConfig scmConfig = conf.getObject(ScmConfig.class);
+    pipelineChoosePolicy = PipelineChoosePolicyFactory
+        .getPolicy(scmConfig, false);
+    ecPipelineChoosePolicy = PipelineChoosePolicyFactory
+        .getPolicy(scmConfig, true);
     if (configurator.getWritableContainerFactory() != null) {
       writableContainerFactory = configurator.getWritableContainerFactory();
     } else {
@@ -2013,6 +2018,10 @@ public final class StorageContainerManager extends 
ServiceRuntimeInfoImpl
     return this.pipelineChoosePolicy;
   }
 
+  public PipelineChoosePolicy getEcPipelineChoosePolicy() {
+    return this.ecPipelineChoosePolicy;
+  }
+
   @Override
   public String getScmId() {
     return getScmStorageConfig().getScmId();
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
index 53bd2f0044..dba6ba0157 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
@@ -21,7 +21,6 @@ import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
 import org.apache.hadoop.hdds.scm.PipelineRequestInformation;
 import org.apache.hadoop.hdds.scm.ScmConfig;
-import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.junit.jupiter.api.Assertions;
@@ -31,6 +30,7 @@ import org.junit.jupiter.api.Test;
 import java.io.IOException;
 import java.util.List;
 
+import static 
org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.PipelineChoosePolicyFactory.OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT;
 import static 
org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.PipelineChoosePolicyFactory.OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT;
 
 /**
@@ -52,14 +52,31 @@ public class TestPipelineChoosePolicyFactory {
   @Test
   public void testDefaultPolicy() throws IOException {
     PipelineChoosePolicy policy = PipelineChoosePolicyFactory
-        .getPolicy(conf);
+        .getPolicy(scmConfig, false);
     Assertions.assertSame(OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
         policy.getClass());
   }
 
+  @Test
+  public void testDefaultPolicyEC() throws IOException {
+    PipelineChoosePolicy policy = PipelineChoosePolicyFactory
+        .getPolicy(scmConfig, true);
+    Assertions.assertSame(OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
+        policy.getClass());
+  }
+
+  @Test
+  public void testNonDefaultPolicyEC() throws IOException {
+    scmConfig.setECPipelineChoosePolicyName(DummyGoodImpl.class.getName());
+    PipelineChoosePolicy policy = PipelineChoosePolicyFactory
+        .getPolicy(scmConfig, true);
+    Assertions.assertSame(DummyGoodImpl.class, policy.getClass());
+  }
+
 
   /**
-   * A dummy pipeline choose policy implementation for test.
+   * A dummy pipeline choose policy implementation for test with an invalid
+   * constructor.
    */
   public static class DummyImpl implements PipelineChoosePolicy {
 
@@ -79,22 +96,52 @@ public class TestPipelineChoosePolicyFactory {
     }
   }
 
+  /**
+   * A dummy pipeline choose policy implementation for test that is valid.
+   */
+  public static class DummyGoodImpl implements PipelineChoosePolicy {
+
+    @Override
+    public Pipeline choosePipeline(List<Pipeline> pipelineList,
+                                   PipelineRequestInformation pri) {
+      return null;
+    }
+
+    @Override
+    public int choosePipelineIndex(List<Pipeline> pipelineList,
+                                   PipelineRequestInformation pri) {
+      return -1;
+    }
+  }
+
+
   @Test
-  public void testConstuctorNotFound() throws SCMException {
+  public void testConstructorNotFound() throws SCMException {
     // set a policy class which does't have the right constructor implemented
     scmConfig.setPipelineChoosePolicyName(DummyImpl.class.getName());
-    PipelineChoosePolicy policy = PipelineChoosePolicyFactory.getPolicy(conf);
+    scmConfig.setECPipelineChoosePolicyName(DummyImpl.class.getName());
+    PipelineChoosePolicy policy =
+        PipelineChoosePolicyFactory.getPolicy(scmConfig, false);
     Assertions.assertSame(OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
         policy.getClass());
+    policy = PipelineChoosePolicyFactory.getPolicy(scmConfig, true);
+    Assertions.assertSame(OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
+        policy.getClass());
   }
 
   @Test
   public void testClassNotImplemented() throws SCMException {
     // set a placement class not implemented
-    conf.set(ScmConfigKeys.OZONE_SCM_CONTAINER_PLACEMENT_IMPL_KEY,
+    scmConfig.setPipelineChoosePolicyName(
+        "org.apache.hadoop.hdds.scm.pipeline.choose.policy.HelloWorld");
+    scmConfig.setECPipelineChoosePolicyName(
         "org.apache.hadoop.hdds.scm.pipeline.choose.policy.HelloWorld");
-    PipelineChoosePolicy policy = PipelineChoosePolicyFactory.getPolicy(conf);
+    PipelineChoosePolicy policy =
+        PipelineChoosePolicyFactory.getPolicy(scmConfig, false);
     Assertions.assertSame(OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
         policy.getClass());
+    policy = PipelineChoosePolicyFactory.getPolicy(scmConfig, true);
+    Assertions.assertSame(OZONE_SCM_EC_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
+        policy.getClass());
   }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to