From 3596e41a01913227197620c318f32a892076d848 Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 19 Jun 2020 09:32:31 +0800
Subject: [PATCH 01/11] HDDS-3833. Use Pipeline choose policy to choose
pipeline from exist pipeline list
---
.../hadoop/hdds/scm/PipelineChoosePolicy.java | 36 ++++++++++
.../apache/hadoop/hdds/scm/ScmConfigKeys.java | 3 +
.../hdds/scm/exceptions/SCMException.java | 3 +-
.../src/main/resources/ozone-default.xml | 14 ++++
.../src/main/proto/ScmServerProtocol.proto | 1 +
.../src/main/resources/proto.lock | 4 ++
.../hdds/scm/block/BlockManagerImpl.java | 8 +--
.../PipelineChoosePolicyFactory.java | 71 +++++++++++++++++++
.../RandomPipelineChoosePolicy.java | 36 ++++++++++
.../choose/algorithms/package-info.java | 18 +++++
.../scm/server/StorageContainerManager.java | 8 +++
11 files changed, 197 insertions(+), 5 deletions(-)
create mode 100644 hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
create mode 100644 hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
create mode 100644 hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
create mode 100644 hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/package-info.java
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
new file mode 100644
index 000000000000..75400de73d4a
--- /dev/null
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.hadoop.hdds.scm;
+
+import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+
+import java.util.List;
+
+/**
+ * A {@link PipelineChoosePolicy} support choosing pipeline from exist list.
+ */
+public interface PipelineChoosePolicy {
+
+ /**
+ * Given an initial list of pipelines, return one of the pipelines.
+ *
+ * @param pipelineList list of pipelines.
+ * @return one of the pipelines.
+ */
+ Pipeline choosePipeline(List pipelineList);
+}
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
index ddb988ae7e1e..af299ab5440e 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
@@ -289,6 +289,9 @@ public final class ScmConfigKeys {
public static final String OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT =
"ozone.scm.pipeline.owner.container.count";
public static final int OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT_DEFAULT = 3;
+ // Pipeline choose policy:
+ public static final String OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY =
+ "ozone.scm.pipeline.choose.impl";
// Pipeline placement policy:
// Upper limit for how many pipelines a datanode can engage in.
public static final String OZONE_DATANODE_PIPELINE_LIMIT =
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/exceptions/SCMException.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/exceptions/SCMException.java
index db1f82ae411d..0146eaed6e33 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/exceptions/SCMException.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/exceptions/SCMException.java
@@ -122,6 +122,7 @@ public enum ResultCodes {
FAILED_TO_FIND_ACTIVE_PIPELINE,
FAILED_TO_INIT_CONTAINER_PLACEMENT_POLICY,
FAILED_TO_ALLOCATE_ENOUGH_BLOCKS,
- INTERNAL_ERROR
+ INTERNAL_ERROR,
+ FAILED_TO_INIT_PIPELINE_CHOOSE_POLICY
}
}
diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index a07807b1998e..c1e9e20cea40 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -814,6 +814,20 @@
value.
+
+ ozone.scm.pipeline.choose.impl
+
+ org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.RandomPipelineChoosePolicy
+
+ OZONE, MANAGEMENT
+
+ 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,
+ org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.RandomPipelineChoosePolicy will be used as default
+ value.
+
+
ozone.scm.pipeline.owner.container.count
3
diff --git a/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto b/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
index fc7a5988ce66..682d4d9c73b4 100644
--- a/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
+++ b/hadoop-hdds/interface-server/src/main/proto/ScmServerProtocol.proto
@@ -114,6 +114,7 @@ enum Status {
FAILED_TO_INIT_CONTAINER_PLACEMENT_POLICY = 26;
FAILED_TO_ALLOCATE_ENOUGH_BLOCKS = 27;
INTERNAL_ERROR = 29;
+ FAILED_TO_INIT_PIPELINE_CHOOSE_POLICY = 30;
}
/**
diff --git a/hadoop-hdds/interface-server/src/main/resources/proto.lock b/hadoop-hdds/interface-server/src/main/resources/proto.lock
index 5492e00b10a3..c9aac445e1e8 100644
--- a/hadoop-hdds/interface-server/src/main/resources/proto.lock
+++ b/hadoop-hdds/interface-server/src/main/resources/proto.lock
@@ -1209,6 +1209,10 @@
{
"name": "INTERNAL_ERROR",
"integer": 29
+ },
+ {
+ "name": "FAILED_TO_INIT_PIPELINE_CHOOSE_POLICY",
+ "integer": 30
}
]
},
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
index 7387585f7c44..ddd894f25ce4 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
@@ -32,6 +32,7 @@
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps;
+import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.ScmUtils;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
@@ -77,6 +78,7 @@ public class BlockManagerImpl implements BlockManager, BlockmanagerMXBean {
private ObjectName mxBean;
private SafeModePrecheck safeModePrecheck;
+ private PipelineChoosePolicy pipelineChoosePolicy;
/**
* Constructor.
@@ -90,7 +92,7 @@ public BlockManagerImpl(final ConfigurationSource conf,
Objects.requireNonNull(scm, "SCM cannot be null");
this.pipelineManager = scm.getPipelineManager();
this.containerManager = scm.getContainerManager();
-
+ this.pipelineChoosePolicy = scm.getPipelineChoosePolicy();
this.containerSize = (long)conf.getStorageSize(
ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE,
ScmConfigKeys.OZONE_SCM_CONTAINER_SIZE_DEFAULT,
@@ -222,9 +224,7 @@ public AllocatedBlock allocateBlock(final long size, ReplicationType type,
}
if (null == pipeline) {
- // TODO: #CLUTIL Make the selection policy driven.
- pipeline = availablePipelines
- .get((int) (Math.random() * availablePipelines.size()));
+ pipeline = pipelineChoosePolicy.choosePipeline(availablePipelines);
}
// look for OPEN containers that match the criteria.
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
new file mode 100644
index 000000000000..345819e89893
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/PipelineChoosePolicyFactory.java
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+
+import org.apache.hadoop.hdds.conf.ConfigurationSource;
+import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
+import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.hdds.scm.exceptions.SCMException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Constructor;
+
+/**
+ * A factory to create pipeline choose policy instance based on configuration
+ * property {@link ScmConfigKeys#OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY}.
+ */
+public final class PipelineChoosePolicyFactory {
+ private static final Logger LOG =
+ LoggerFactory.getLogger(PipelineChoosePolicyFactory.class);
+
+ private static final Class extends PipelineChoosePolicy>
+ OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT =
+ RandomPipelineChoosePolicy.class;
+
+ private PipelineChoosePolicyFactory() {
+ }
+
+ public static PipelineChoosePolicy getPolicy(
+ ConfigurationSource conf) throws SCMException {
+ final Class extends PipelineChoosePolicy> policyClass = conf
+ .getClass(ScmConfigKeys.OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY,
+ OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT,
+ PipelineChoosePolicy.class);
+ Constructor extends PipelineChoosePolicy> constructor;
+ try {
+ constructor = policyClass.getDeclaredConstructor();
+ LOG.info("Create pipeline choose policy of type {}",
+ policyClass.getCanonicalName());
+ } catch (NoSuchMethodException e) {
+ String msg = "Failed to find constructor() for class " +
+ policyClass.getCanonicalName();
+ LOG.error(msg);
+ throw new SCMException(msg,
+ SCMException.ResultCodes.FAILED_TO_INIT_PIPELINE_CHOOSE_POLICY);
+ }
+
+ try {
+ return constructor.newInstance();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to instantiate class " +
+ policyClass.getCanonicalName() + " for " + e.getMessage());
+ }
+ }
+}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
new file mode 100644
index 000000000000..9f12c208e6f3
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+
+import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
+import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+
+import java.util.List;
+
+/**
+ * Random choose policy that randomly chooses pipeline.
+ * That is we just randomly place containers without any considerations of
+ * utilization.
+ */
+public class RandomPipelineChoosePolicy implements PipelineChoosePolicy {
+
+ @Override
+ public Pipeline choosePipeline(List pipelineList) {
+ return pipelineList.get((int) (Math.random() * pipelineList.size()));
+ }
+}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/package-info.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/package-info.java
new file mode 100644
index 000000000000..7ca0b7d0c98b
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/package-info.java
@@ -0,0 +1,18 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+// Various pipeline choosing algorithms.
\ No newline at end of file
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 621b126a1e8c..c87e405e8dbb 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
@@ -42,6 +42,7 @@
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeState;
+import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
import org.apache.hadoop.hdds.scm.PlacementPolicy;
import org.apache.hadoop.hdds.scm.ScmConfig;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
@@ -82,6 +83,7 @@
import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
import org.apache.hadoop.hdds.scm.pipeline.PipelineReportHandler;
import org.apache.hadoop.hdds.scm.pipeline.SCMPipelineManager;
+import org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.PipelineChoosePolicyFactory;
import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
import org.apache.hadoop.hdds.security.exception.SCMSecurityException;
import org.apache.hadoop.hdds.security.x509.SecurityConfig;
@@ -199,6 +201,7 @@ public final class StorageContainerManager extends ServiceRuntimeInfoImpl
* Network topology Map.
*/
private NetworkTopology clusterMap;
+ private PipelineChoosePolicy pipelineChoosePolicy;
/**
* Creates a new StorageContainerManager. Configuration will be
@@ -421,6 +424,7 @@ private void initializeSystemManagers(OzoneConfiguration conf,
pipelineManager);
}
+ pipelineChoosePolicy = PipelineChoosePolicyFactory.getPolicy(conf);
if (configurator.getScmBlockManager() != null) {
scmBlockManager = configurator.getScmBlockManager();
} else {
@@ -1132,4 +1136,8 @@ public Map getRuleStatusMetrics() {
}
return map;
}
+
+ public PipelineChoosePolicy getPipelineChoosePolicy() {
+ return this.pipelineChoosePolicy;
+ }
}
From 54bc1eaab1d4be8e3320061b1b1357915e4ff641 Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 24 Jul 2020 13:27:01 +0800
Subject: [PATCH 02/11] HDDS-3833. Address comments, rename the key, add
fallback code.
---
.../apache/hadoop/hdds/scm/ScmConfigKeys.java | 4 +--
.../PipelineChoosePolicyFactory.java | 27 ++++++++++++++++---
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
index af299ab5440e..54c859f34abd 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
@@ -290,8 +290,8 @@ public final class ScmConfigKeys {
"ozone.scm.pipeline.owner.container.count";
public static final int OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT_DEFAULT = 3;
// Pipeline choose policy:
- public static final String OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY =
- "ozone.scm.pipeline.choose.impl";
+ public static final String OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY =
+ "ozone.scm.pipeline.choose.policy.impl";
// Pipeline placement policy:
// Upper limit for how many pipelines a datanode can engage in.
public static final String OZONE_DATANODE_PIPELINE_LIMIT =
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 345819e89893..731448ccdccf 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
@@ -22,6 +22,7 @@
import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
+import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,14 +30,14 @@
/**
* A factory to create pipeline choose policy instance based on configuration
- * property {@link ScmConfigKeys#OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY}.
+ * property {@link ScmConfigKeys#OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY}.
*/
public final class PipelineChoosePolicyFactory {
private static final Logger LOG =
LoggerFactory.getLogger(PipelineChoosePolicyFactory.class);
private static final Class extends PipelineChoosePolicy>
- OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT =
+ OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT =
RandomPipelineChoosePolicy.class;
private PipelineChoosePolicyFactory() {
@@ -45,9 +46,27 @@ private PipelineChoosePolicyFactory() {
public static PipelineChoosePolicy getPolicy(
ConfigurationSource conf) throws SCMException {
final Class extends PipelineChoosePolicy> policyClass = conf
- .getClass(ScmConfigKeys.OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY,
- OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT,
+ .getClass(ScmConfigKeys.OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY,
+ OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
PipelineChoosePolicy.class);
+ try {
+ return createPipelineChoosePolicyFromClass(policyClass);
+ } catch (Exception e) {
+ if (policyClass != OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT) {
+ 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);
+ }
+ throw e;
+ }
+ }
+
+ @NotNull
+ private static PipelineChoosePolicy createPipelineChoosePolicyFromClass(
+ Class extends PipelineChoosePolicy> policyClass) throws SCMException {
Constructor extends PipelineChoosePolicy> constructor;
try {
constructor = policyClass.getDeclaredConstructor();
From 1d48df448f73400bf52e672c8844932de2700aea Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 24 Jul 2020 21:44:54 +0800
Subject: [PATCH 03/11] HDDS-3833. Address comments. Add a new policy.
---
.../hadoop/hdds/scm/PipelineChoosePolicy.java | 8 +++-
.../hdds/scm/block/BlockManagerImpl.java | 6 ++-
.../HealthyPipelineChoosePolicy.java | 46 +++++++++++++++++++
.../RandomPipelineChoosePolicy.java | 6 ++-
4 files changed, 62 insertions(+), 4 deletions(-)
create mode 100644 hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
index 75400de73d4a..7b07c732c96d 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
@@ -19,18 +19,24 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* A {@link PipelineChoosePolicy} support choosing pipeline from exist list.
*/
public interface PipelineChoosePolicy {
+ String PIPELINE_CHOOSE_POLICY_PARAM_SIZE =
+ "pipeline_choose_policy_param_size";
+
/**
* Given an initial list of pipelines, return one of the pipelines.
*
* @param pipelineList list of pipelines.
* @return one of the pipelines.
*/
- Pipeline choosePipeline(List pipelineList);
+ Pipeline choosePipeline(List pipelineList,
+ Map params);
}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
index ddd894f25ce4..b8d7539a5325 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
@@ -224,7 +224,11 @@ public AllocatedBlock allocateBlock(final long size, ReplicationType type,
}
if (null == pipeline) {
- pipeline = pipelineChoosePolicy.choosePipeline(availablePipelines);
+ Map params = new HashMap<>();
+ params.put(
+ PipelineChoosePolicy.PIPELINE_CHOOSE_POLICY_PARAM_SIZE, size);
+ pipeline = pipelineChoosePolicy.choosePipeline(
+ availablePipelines, params);
}
// look for OPEN containers that match the criteria.
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
new file mode 100644
index 000000000000..cf573ab90890
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+
+import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The healthy pipeline choose policy that chooses pipeline
+ * until return healthy pipeline.
+ */
+public class HealthyPipelineChoosePolicy extends RandomPipelineChoosePolicy {
+
+ @Override
+ public Pipeline choosePipeline(List pipelineList,
+ Map params) {
+ Pipeline fallback = null;
+ while (pipelineList.size() > 0) {
+ Pipeline pipeline = super.choosePipeline(pipelineList, params);
+ if (pipeline.isHealthy()) {
+ return pipeline;
+ } else {
+ fallback = pipeline;
+ pipelineList.remove(pipeline);
+ }
+ }
+ return fallback;
+ }
+}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
index 9f12c208e6f3..b8eab9ad5812 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
@@ -21,16 +21,18 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import java.util.List;
+import java.util.Map;
/**
* Random choose policy that randomly chooses pipeline.
- * That is we just randomly place containers without any considerations of
+ * That are we just randomly place containers without any considerations of
* utilization.
*/
public class RandomPipelineChoosePolicy implements PipelineChoosePolicy {
@Override
- public Pipeline choosePipeline(List pipelineList) {
+ public Pipeline choosePipeline(List pipelineList,
+ Map params) {
return pipelineList.get((int) (Math.random() * pipelineList.size()));
}
}
From 85f829231161c35c80014b27d3da94b7ee6841c7 Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 24 Jul 2020 21:53:29 +0800
Subject: [PATCH 04/11] fix style.
---
.../java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
index 7b07c732c96d..7b92042b032e 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
@@ -19,7 +19,6 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
From 7bdcbb95a31a18382e2b6b9c14f8722916e5525c Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Sat, 25 Jul 2020 08:07:16 +0800
Subject: [PATCH 05/11] Correct the ozone-default.xml
---
hadoop-hdds/common/src/main/resources/ozone-default.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index c1e9e20cea40..cbc708456be8 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -815,7 +815,7 @@
- ozone.scm.pipeline.choose.impl
+ ozone.scm.pipeline.choose.policy.impl
org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.RandomPipelineChoosePolicy
From c7b62a3c5072a07fa473e944df3c615c95167d7b Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 00:43:47 +0800
Subject: [PATCH 06/11] Address comments, create PipelineRequestInformation as
the general parameter entity.
---
.../hadoop/hdds/scm/PipelineChoosePolicy.java | 6 +-
.../hdds/scm/PipelineRequestInformation.java | 59 +++++++++++++++++++
.../hdds/scm/block/BlockManagerImpl.java | 10 ++--
.../HealthyPipelineChoosePolicy.java | 6 +-
.../RandomPipelineChoosePolicy.java | 3 +-
5 files changed, 71 insertions(+), 13 deletions(-)
create mode 100644 hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
index 7b92042b032e..c829e2eab651 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineChoosePolicy.java
@@ -20,16 +20,12 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import java.util.List;
-import java.util.Map;
/**
* A {@link PipelineChoosePolicy} support choosing pipeline from exist list.
*/
public interface PipelineChoosePolicy {
- String PIPELINE_CHOOSE_POLICY_PARAM_SIZE =
- "pipeline_choose_policy_param_size";
-
/**
* Given an initial list of pipelines, return one of the pipelines.
*
@@ -37,5 +33,5 @@ public interface PipelineChoosePolicy {
* @return one of the pipelines.
*/
Pipeline choosePipeline(List pipelineList,
- Map params);
+ PipelineRequestInformation pri);
}
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
new file mode 100644
index 000000000000..ac25b0aa9144
--- /dev/null
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hdds.scm;
+
+/**
+ * The information of the request of pipeline.
+ */
+public final class PipelineRequestInformation {
+ private long size;
+
+ /**
+ * Builder for PipelineRequestInformation.
+ */
+ public static class Builder {
+ private long size;
+
+ public static Builder getBuilder() {
+ return new Builder();
+ }
+
+ /**
+ * sets the size.
+ * @param size request size
+ * @return Builder for PipelineRequestInformation
+ */
+ public PipelineRequestInformation.Builder setSize(long size) {
+ this.size = size;
+ return this;
+ }
+
+ public PipelineRequestInformation build() {
+ return new PipelineRequestInformation(size);
+ }
+ }
+
+ private PipelineRequestInformation(long size) {
+ this.size = size;
+ }
+
+ public long getSize() {
+ return size;
+ }
+}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
index b8d7539a5325..b5b2aafa9ed4 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
@@ -33,6 +33,7 @@
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ScmOps;
import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
+import org.apache.hadoop.hdds.scm.PipelineRequestInformation;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.ScmUtils;
import org.apache.hadoop.hdds.scm.container.ContainerInfo;
@@ -224,11 +225,12 @@ public AllocatedBlock allocateBlock(final long size, ReplicationType type,
}
if (null == pipeline) {
- Map params = new HashMap<>();
- params.put(
- PipelineChoosePolicy.PIPELINE_CHOOSE_POLICY_PARAM_SIZE, size);
+ PipelineRequestInformation pri =
+ PipelineRequestInformation.Builder.getBuilder()
+ .setSize(size)
+ .build();
pipeline = pipelineChoosePolicy.choosePipeline(
- availablePipelines, params);
+ availablePipelines, pri);
}
// look for OPEN containers that match the criteria.
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
index cf573ab90890..9f77caa6828f 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/HealthyPipelineChoosePolicy.java
@@ -17,10 +17,10 @@
package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+import org.apache.hadoop.hdds.scm.PipelineRequestInformation;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import java.util.List;
-import java.util.Map;
/**
* The healthy pipeline choose policy that chooses pipeline
@@ -30,10 +30,10 @@ public class HealthyPipelineChoosePolicy extends RandomPipelineChoosePolicy {
@Override
public Pipeline choosePipeline(List pipelineList,
- Map params) {
+ PipelineRequestInformation pri) {
Pipeline fallback = null;
while (pipelineList.size() > 0) {
- Pipeline pipeline = super.choosePipeline(pipelineList, params);
+ Pipeline pipeline = super.choosePipeline(pipelineList, pri);
if (pipeline.isHealthy()) {
return pipeline;
} else {
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
index b8eab9ad5812..cc841dd791d9 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
@@ -18,6 +18,7 @@
package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
+import org.apache.hadoop.hdds.scm.PipelineRequestInformation;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import java.util.List;
@@ -32,7 +33,7 @@ public class RandomPipelineChoosePolicy implements PipelineChoosePolicy {
@Override
public Pipeline choosePipeline(List pipelineList,
- Map params) {
+ PipelineRequestInformation pri) {
return pipelineList.get((int) (Math.random() * pipelineList.size()));
}
}
From b16249d1135ed68e8e86324e33f7f1a1f71791fd Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 00:45:08 +0800
Subject: [PATCH 07/11] Revert proto.lock
---
hadoop-hdds/interface-server/src/main/resources/proto.lock | 4 ----
1 file changed, 4 deletions(-)
diff --git a/hadoop-hdds/interface-server/src/main/resources/proto.lock b/hadoop-hdds/interface-server/src/main/resources/proto.lock
index c9aac445e1e8..5492e00b10a3 100644
--- a/hadoop-hdds/interface-server/src/main/resources/proto.lock
+++ b/hadoop-hdds/interface-server/src/main/resources/proto.lock
@@ -1209,10 +1209,6 @@
{
"name": "INTERNAL_ERROR",
"integer": 29
- },
- {
- "name": "FAILED_TO_INIT_PIPELINE_CHOOSE_POLICY",
- "integer": 30
}
]
},
From 5e9a2035cf7813087d87400cfea10d5a435af029 Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 01:23:14 +0800
Subject: [PATCH 08/11] Use Java based configuration API to write config.
---
.../org/apache/hadoop/hdds/scm/ScmConfig.java | 19 ++++++++++++++
.../apache/hadoop/hdds/scm/ScmConfigKeys.java | 4 +--
.../PipelineChoosePolicyFactory.java | 25 ++++++++++++++-----
3 files changed, 39 insertions(+), 9 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 73701ea55c9d..424680956b7e 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
@@ -59,6 +59,21 @@ public class ScmConfig {
)
private String action;
+ @Config(key = "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 to find or "
+ + "allocate container. If not set, "
+ + "org.apache.hadoop.hdds.scm.pipeline.choose.algorithms. "
+ + "RandomPipelineChoosePolicy will be used as default value."
+ )
+ private String pipelineChoosePolicyName;
+
public void setKerberosPrincipal(String kerberosPrincipal) {
this.principal = kerberosPrincipal;
}
@@ -84,6 +99,10 @@ public String getUnknownContainerAction() {
return this.action;
}
+ public String getPipelineChoosePolicyName() {
+ return pipelineChoosePolicyName;
+ }
+
/**
* Configuration strings class.
* required for SCMSecurityProtocol where the KerberosInfo references
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
index 54c859f34abd..4e624c695889 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java
@@ -289,9 +289,7 @@ public final class ScmConfigKeys {
public static final String OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT =
"ozone.scm.pipeline.owner.container.count";
public static final int OZONE_SCM_PIPELINE_OWNER_CONTAINER_COUNT_DEFAULT = 3;
- // Pipeline choose policy:
- public static final String OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY =
- "ozone.scm.pipeline.choose.policy.impl";
+
// Pipeline placement policy:
// Upper limit for how many pipelines a datanode can engage in.
public static final String OZONE_DATANODE_PIPELINE_LIMIT =
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 731448ccdccf..cbd9e6200eb1 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
@@ -20,7 +20,7 @@
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.scm.PipelineChoosePolicy;
-import org.apache.hadoop.hdds.scm.ScmConfigKeys;
+import org.apache.hadoop.hdds.scm.ScmConfig;
import org.apache.hadoop.hdds.scm.exceptions.SCMException;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
@@ -30,7 +30,7 @@
/**
* A factory to create pipeline choose policy instance based on configuration
- * property {@link ScmConfigKeys#OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY}.
+ * property {@link ScmConfig}.
*/
public final class PipelineChoosePolicyFactory {
private static final Logger LOG =
@@ -45,10 +45,23 @@ private PipelineChoosePolicyFactory() {
public static PipelineChoosePolicy getPolicy(
ConfigurationSource conf) throws SCMException {
- final Class extends PipelineChoosePolicy> policyClass = conf
- .getClass(ScmConfigKeys.OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_KEY,
- OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
- PipelineChoosePolicy.class);
+ ScmConfig scmConfig = conf.getObject(ScmConfig.class);
+ Class extends PipelineChoosePolicy> policyClass;
+ try {
+ String policyName = scmConfig.getPipelineChoosePolicyName();
+ Class> theClass = Class.forName(policyName);
+ Class xface = PipelineChoosePolicy.class;
+ if (theClass != null && !xface.isAssignableFrom(theClass)) {
+ throw new RuntimeException(theClass + " not " + xface.getName());
+ } else if (theClass != null) {
+ policyClass = theClass.asSubclass(xface);
+ } else {
+ policyClass = null;
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
try {
return createPipelineChoosePolicyFromClass(policyClass);
} catch (Exception e) {
From 9b7cfc563d66a169093e5e09fbcd38f6d2afc9c2 Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 01:26:00 +0800
Subject: [PATCH 09/11] fix style.
---
.../apache/hadoop/hdds/scm/PipelineRequestInformation.java | 6 +++---
.../choose/algorithms/RandomPipelineChoosePolicy.java | 1 -
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
index ac25b0aa9144..ac0cfbe57beb 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/PipelineRequestInformation.java
@@ -36,11 +36,11 @@ public static Builder getBuilder() {
/**
* sets the size.
- * @param size request size
+ * @param sz request size
* @return Builder for PipelineRequestInformation
*/
- public PipelineRequestInformation.Builder setSize(long size) {
- this.size = size;
+ public Builder setSize(long sz) {
+ this.size = sz;
return this;
}
diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
index cc841dd791d9..080ea969f1e9 100644
--- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
+++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/RandomPipelineChoosePolicy.java
@@ -22,7 +22,6 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import java.util.List;
-import java.util.Map;
/**
* Random choose policy that randomly chooses pipeline.
From 399d574b682fc4155def121630d812721b60847b Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 01:47:01 +0800
Subject: [PATCH 10/11] Add some tests.
---
.../org/apache/hadoop/hdds/scm/ScmConfig.java | 4 +
.../PipelineChoosePolicyFactory.java | 35 +++----
.../TestPipelineChoosePolicyFactory.java | 94 +++++++++++++++++++
3 files changed, 117 insertions(+), 16 deletions(-)
create mode 100644 hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
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 424680956b7e..3084bb4cc396 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
@@ -87,6 +87,10 @@ public void setUnknownContainerAction(String unknownContainerAction) {
this.action = unknownContainerAction;
}
+ public void setPipelineChoosePolicyName(String pipelineChoosePolicyName) {
+ this.pipelineChoosePolicyName = pipelineChoosePolicyName;
+ }
+
public String getKerberosPrincipal() {
return this.principal;
}
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 cbd9e6200eb1..b24091f7f23c 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
@@ -18,6 +18,7 @@
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;
@@ -36,7 +37,8 @@ public final class PipelineChoosePolicyFactory {
private static final Logger LOG =
LoggerFactory.getLogger(PipelineChoosePolicyFactory.class);
- private static final Class extends PipelineChoosePolicy>
+ @VisibleForTesting
+ public static final Class extends PipelineChoosePolicy>
OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT =
RandomPipelineChoosePolicy.class;
@@ -46,21 +48,8 @@ private PipelineChoosePolicyFactory() {
public static PipelineChoosePolicy getPolicy(
ConfigurationSource conf) throws SCMException {
ScmConfig scmConfig = conf.getObject(ScmConfig.class);
- Class extends PipelineChoosePolicy> policyClass;
- try {
- String policyName = scmConfig.getPipelineChoosePolicyName();
- Class> theClass = Class.forName(policyName);
- Class xface = PipelineChoosePolicy.class;
- if (theClass != null && !xface.isAssignableFrom(theClass)) {
- throw new RuntimeException(theClass + " not " + xface.getName());
- } else if (theClass != null) {
- policyClass = theClass.asSubclass(xface);
- } else {
- policyClass = null;
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ Class extends PipelineChoosePolicy> policyClass = getClass(
+ scmConfig.getPipelineChoosePolicyName(), PipelineChoosePolicy.class);
try {
return createPipelineChoosePolicyFromClass(policyClass);
@@ -100,4 +89,18 @@ private static PipelineChoosePolicy createPipelineChoosePolicyFromClass(
policyClass.getCanonicalName() + " for " + e.getMessage());
}
}
+
+ private static Class extends U> getClass(String name,
+ Class xface) {
+ try {
+ Class> theClass = Class.forName(name);
+ if (!xface.isAssignableFrom(theClass)) {
+ throw new RuntimeException(theClass + " not " + xface.getName());
+ } else {
+ return theClass.asSubclass(xface);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
}
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
new file mode 100644
index 000000000000..804c5bb98a3f
--- /dev/null
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/choose/algorithms/TestPipelineChoosePolicyFactory.java
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.hadoop.hdds.scm.pipeline.choose.algorithms;
+
+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.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.PipelineChoosePolicyFactory.OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT;
+
+/**
+ * Test for scm pipeline choose policy factory.
+ */
+public class TestPipelineChoosePolicyFactory {
+
+ private OzoneConfiguration conf;
+
+ private ScmConfig scmConfig;
+
+ @Before
+ public void setup() {
+ //initialize network topology instance
+ conf = new OzoneConfiguration();
+ scmConfig = conf.getObject(ScmConfig.class);
+ }
+
+ @Test
+ public void testDefaultPolicy() throws IOException {
+ PipelineChoosePolicy policy = PipelineChoosePolicyFactory
+ .getPolicy(conf);
+ Assert.assertSame(OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
+ policy.getClass());
+ }
+
+
+ /**
+ * A dummy pipeline choose policy implementation for test.
+ */
+ public static class DummyImpl implements PipelineChoosePolicy {
+
+ public DummyImpl(String dummy) {
+ }
+
+ @Override
+ public Pipeline choosePipeline(List pipelineList,
+ PipelineRequestInformation pri) {
+ return null;
+ }
+ }
+
+ @Test
+ public void testConstuctorNotFound() throws SCMException {
+ // set a policy class which does't have the right constructor implemented
+ scmConfig.setPipelineChoosePolicyName(DummyImpl.class.getName());
+ PipelineChoosePolicy policy = PipelineChoosePolicyFactory.getPolicy(conf);
+ Assert.assertSame(OZONE_SCM_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,
+ "org.apache.hadoop.hdds.scm.pipeline.choose.policy.HelloWorld");
+ PipelineChoosePolicy policy = PipelineChoosePolicyFactory.getPolicy(conf);
+ Assert.assertSame(OZONE_SCM_PIPELINE_CHOOSE_POLICY_IMPL_DEFAULT,
+ policy.getClass());
+ }
+}
From 8f3769db087d32785f3725a803ec2f298a69851a Mon Sep 17 00:00:00 2001
From: maobaolong <307499405@qq.com>
Date: Fri, 31 Jul 2020 08:56:51 +0800
Subject: [PATCH 11/11] fix test failed
---
.../common/src/main/resources/ozone-default.xml | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index b15a8d0a8895..b9774aab9b1c 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -814,20 +814,6 @@
value.
-
- ozone.scm.pipeline.choose.policy.impl
-
- org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.RandomPipelineChoosePolicy
-
- OZONE, MANAGEMENT
-
- 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,
- org.apache.hadoop.hdds.scm.pipeline.choose.algorithms.RandomPipelineChoosePolicy will be used as default
- value.
-
-
ozone.scm.pipeline.owner.container.count
3