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 + OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT = + RandomPipelineChoosePolicy.class; + + private PipelineChoosePolicyFactory() { + } + + public static PipelineChoosePolicy getPolicy( + ConfigurationSource conf) throws SCMException { + final Class policyClass = conf + .getClass(ScmConfigKeys.OZONE_SCM_PIPELINE_CHOOSE_IMPL_KEY, + OZONE_SCM_PIPELINE_CHOOSE_IMPL_DEFAULT, + PipelineChoosePolicy.class); + Constructor 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 - 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 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 policyClass) throws SCMException { Constructor 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 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 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 + @VisibleForTesting + public static final Class 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 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 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 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