This is an automated email from the ASF dual-hosted git repository. yiyang0203 pushed a commit to branch HDDS-5713 in repository https://gitbox.apache.org/repos/asf/ozone.git
commit 3533b268dc036f13259abc59a745791c616b6a55 Author: Symious <[email protected]> AuthorDate: Thu Sep 22 10:00:39 2022 +0800 HDDS-7234. Add a common option for DiskBalancer commands (#3762) --- .../scm/cli/datanode/DiskBalancerCommands.java | 18 ++--- .../cli/datanode/DiskBalancerCommonOptions.java | 84 ++++++++++++++++++++++ .../cli/datanode/DiskBalancerStartSubcommand.java | 27 +++---- .../cli/datanode/DiskBalancerStatusSubcommand.java | 7 +- .../cli/datanode/DiskBalancerStopSubcommand.java | 29 +++----- .../cli/datanode/DiskBalancerUpdateSubcommand.java | 27 +++---- 6 files changed, 123 insertions(+), 69 deletions(-) diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommands.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommands.java index 649ee59eaa..dd70bbb491 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommands.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommands.java @@ -38,36 +38,38 @@ import java.util.concurrent.Callable; * [ -t/--threshold {@literal <threshold>}] * [ -b/--bandwidthInMB {@literal <bandwidthInMB>}] * [ -p/--parallelThread {@literal <parallelThread>}] - * [ -a/--alldatanodes {@literal <alldatanodes>}] + * [ -a/--all {@literal <alldatanodes>}] + * [ -d/--datanodes {@literal <datanodes>}] * [ {@literal <hosts>}] * Examples: - * ozone admin datanode diskbalancer start {@literal <hosts>} + * ozone admin datanode diskbalancer start -d {@literal <hosts>} * start balancer with default values in the configuration on specified * datanodes * ozone admin datanode diskbalancer start -a * start balancer with default values in the configuration on all * datanodes in the cluster - * ozone admin datanode diskbalancer start -t 5 {@literal <hosts>} + * ozone admin datanode diskbalancer start -t 5 -d {@literal <hosts>} * start balancer with a threshold of 5% - * ozone admin datanode diskbalancer start -b 20 {@literal <hosts>} + * ozone admin datanode diskbalancer start -b 20 -d {@literal <hosts>} * start balancer with maximum 20MB/s diskbandwidth - * ozone admin datanode diskbalancer start -p 5 {@literal <hosts>} + * ozone admin datanode diskbalancer start -p 5 -d {@literal <hosts>} * start balancer with 5 parallel thread on each datanode * To stop: * ozone admin datanode diskbalancer stop -a * stop diskblancer on all datanodes - * ozone admin datanode diskbalancer stop {@literal <hosts>}; + * ozone admin datanode diskbalancer stop -d {@literal <hosts>}; * stop diskblancer on all datanodes * To update: * ozone admin datanode diskbalancer update -a * update diskblancer configuration on all datanodes - * ozone admin datanode diskbalancer update {@literal <hosts>}; + * ozone admin datanode diskbalancer update -d {@literal <hosts>}; * update diskblancer configuration on all datanodes * To get report: * ozone admin datanode diskbalancer report -c 10 * retrieve at most 10 datanodes that needs diskbalance most * To get status: - * ozone admin datanode diskbalancer status -s RUNNING {@literal <hosts>} + * ozone admin datanode diskbalancer status -s RUNNING -d + * {@literal <hosts>} * return the diskbalancer status on datanodes where diskbalancer are in * Running state * diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommonOptions.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommonOptions.java new file mode 100644 index 0000000000..744de5169f --- /dev/null +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerCommonOptions.java @@ -0,0 +1,84 @@ +/* + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.cli.datanode; + +import picocli.CommandLine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Common options for DiskBalancer commands. + */ +public class DiskBalancerCommonOptions { + + @CommandLine.Option(names = {"-a", "--all"}, + description = "Run commands on all datanodes.") + private boolean allHosts; + + @CommandLine.Option(names = {"-d", "--datanodes"}, + description = "Run commands on specific datanodes, the content can be " + + "a list of hostnames or IPs. " + + "Examples: hostname1,hostname2,hostname3 or ip1,ip2,ip3") + private List<String> datanodes = new ArrayList<>(); + + /** + * Check the common options of DiskBalancerCommand. + * @return if the check passed + */ + public boolean check() { + if (datanodes.size() == 0 && !allHosts) { + System.out.println("Datanode not specified. Please specify at least " + + "one datanode or use \"-a(--all)\" to start diskBalancer " + + "on all datanodes"); + return false; + } + if (datanodes.size() != 0 && allHosts) { + System.out.println("Invalid option selection. " + + "Use either \"-a(--all)\" or \"-d(--datanodes)\"."); + return false; + } + return true; + } + + public String getHostString() { + return isAllHosts() ? "All datanodes" : String.join("\n", getDatanodes()); + } + + public Optional<List<String>> getSpecifiedDatanodes() { + return getDatanodes().size() == 0 ? + Optional.empty() : Optional.of(getDatanodes()); + } + + public boolean isAllHosts() { + return allHosts; + } + + public void setAllHosts(boolean allHosts) { + this.allHosts = allHosts; + } + + public List<String> getDatanodes() { + return datanodes; + } + + public void setDatanodes(List<String> datanodes) { + this.datanodes = datanodes; + } +} diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStartSubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStartSubcommand.java index e3862ba23f..f58c7a1f84 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStartSubcommand.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStartSubcommand.java @@ -22,12 +22,11 @@ import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.cli.ScmSubcommand; import org.apache.hadoop.hdds.scm.client.ScmClient; +import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; -import picocli.CommandLine.Parameters; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -55,31 +54,21 @@ public class DiskBalancerStartSubcommand extends ScmSubcommand { description = "Max parallelThread for DiskBalancer.") private Optional<Integer> parallelThread; - @Option(names = {"-a", "--allDatanodes"}, - description = "Start diskBalancer on all datanodes.") - private boolean allHosts; - - @Parameters(description = "List of fully qualified host names") - private List<String> hosts = new ArrayList<>(); + @CommandLine.Mixin + private DiskBalancerCommonOptions commonOptions = + new DiskBalancerCommonOptions(); @Override public void execute(ScmClient scmClient) throws IOException { - if (hosts.size() == 0 && !allHosts) { - System.out.println("Datanode not specified. Please specify " + - "\"--allDatanodes\" to start diskBalancer on all datanodes"); - return; - } - if (hosts.size() != 0 && allHosts) { - System.out.println("Confused options. Omit \"--allDatanodes\" or " + - "Datanodes."); + if (!commonOptions.check()) { return; } List<DatanodeAdminError> errors = scmClient.startDiskBalancer(threshold, bandwidthInMB, parallelThread, - hosts.size() == 0 ? Optional.empty() : Optional.of(hosts)); + commonOptions.getSpecifiedDatanodes()); System.out.println("Start DiskBalancer on datanode(s):\n" + - (allHosts ? "All datanodes" : String.join("\n", hosts))); + commonOptions.getHostString()); if (errors.size() > 0) { for (DatanodeAdminError error : errors) { @@ -95,6 +84,6 @@ public class DiskBalancerStartSubcommand extends ScmSubcommand { @VisibleForTesting public void setAllHosts(boolean allHosts) { - this.allHosts = allHosts; + this.commonOptions.setAllHosts(allHosts); } } \ No newline at end of file diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStatusSubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStatusSubcommand.java index 6a61876479..84dd3abe95 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStatusSubcommand.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStatusSubcommand.java @@ -21,9 +21,9 @@ import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.scm.cli.ScmSubcommand; import org.apache.hadoop.hdds.scm.client.ScmClient; +import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; -import picocli.CommandLine.Parameters; import java.io.IOException; import java.util.ArrayList; @@ -48,10 +48,11 @@ public class DiskBalancerStatusSubcommand extends ScmSubcommand { new HashSet<>(Arrays.asList("RUNNING", "STOPPED", "UNKNOWN")); @Option(names = {"-s", "--state"}, - description = "RUNNING, STOPPED, UNKNOWN") + description = "RUNNING, STOPPED, UNKNOWN. Default state is RUNNING.") private String state = "RUNNING"; - @Parameters(description = "List of fully qualified host names") + @CommandLine.Option(names = {"-d", "--datanodes"}, + description = "Get diskBalancer status on specific datanodes.") private List<String> hosts = new ArrayList<>(); @Override diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStopSubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStopSubcommand.java index 9479c030a6..f63f880a44 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStopSubcommand.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerStopSubcommand.java @@ -22,14 +22,11 @@ import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.cli.ScmSubcommand; import org.apache.hadoop.hdds.scm.client.ScmClient; +import picocli.CommandLine; import picocli.CommandLine.Command; -import picocli.CommandLine.Option; -import picocli.CommandLine.Parameters; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import java.util.Optional; /** * Handler to stop disk balancer. @@ -40,29 +37,21 @@ import java.util.Optional; mixinStandardHelpOptions = true, versionProvider = HddsVersionProvider.class) public class DiskBalancerStopSubcommand extends ScmSubcommand { - @Option(names = {"-a", "--allDatanodes"}, - description = "Stop diskBalancer on all datanodes.") - private boolean allHosts; - @Parameters(description = "List of fully qualified host names") - private List<String> hosts = new ArrayList<>(); + @CommandLine.Mixin + private DiskBalancerCommonOptions commonOptions = + new DiskBalancerCommonOptions(); @Override public void execute(ScmClient scmClient) throws IOException { - if (hosts.size() == 0 && !allHosts) { - System.out.println("Datanode not specified."); + if (!commonOptions.check()) { return; } - if (hosts.size() != 0 && allHosts) { - System.out.println("Confused options. Omit \"--allDatanodes\" or " + - "Datanodes."); - return; - } - List<DatanodeAdminError> errors = scmClient.stopDiskBalancer(allHosts ? - Optional.empty() : Optional.of(hosts)); + List<DatanodeAdminError> errors = scmClient.stopDiskBalancer( + commonOptions.getSpecifiedDatanodes()); System.out.println("Stopping DiskBalancer on datanode(s):\n" + - (allHosts ? "All datanodes" : String.join("\n", hosts))); + commonOptions.getHostString()); if (errors.size() > 0) { for (DatanodeAdminError error : errors) { System.err.println("Error: " + error.getHostname() + ": " @@ -77,6 +66,6 @@ public class DiskBalancerStopSubcommand extends ScmSubcommand { @VisibleForTesting public void setAllHosts(boolean allHosts) { - this.allHosts = allHosts; + this.commonOptions.setAllHosts(allHosts); } } diff --git a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerUpdateSubcommand.java b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerUpdateSubcommand.java index b19fb6a53a..28ed4fd325 100644 --- a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerUpdateSubcommand.java +++ b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DiskBalancerUpdateSubcommand.java @@ -22,12 +22,11 @@ import org.apache.hadoop.hdds.cli.HddsVersionProvider; import org.apache.hadoop.hdds.scm.DatanodeAdminError; import org.apache.hadoop.hdds.scm.cli.ScmSubcommand; import org.apache.hadoop.hdds.scm.client.ScmClient; +import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; -import picocli.CommandLine.Parameters; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -55,31 +54,21 @@ public class DiskBalancerUpdateSubcommand extends ScmSubcommand { description = "Max parallelThread for DiskBalancer.") private Optional<Integer> parallelThread; - @Option(names = {"-a", "--allDatanodes"}, - description = "Start diskBalancer on all datanodes.") - private boolean allHosts; - - @Parameters(description = "List of fully qualified host names") - private List<String> hosts = new ArrayList<>(); + @CommandLine.Mixin + private DiskBalancerCommonOptions commonOptions = + new DiskBalancerCommonOptions(); @Override public void execute(ScmClient scmClient) throws IOException { - if (hosts.size() == 0 && !allHosts) { - System.out.println("Datanode not specified."); - return; - } - if (hosts.size() != 0 && allHosts) { - System.out.println("Confused options. Omit \"--allDatanodes\" or " + - "Datanodes."); + if (!commonOptions.check()) { return; } List<DatanodeAdminError> errors = scmClient.updateDiskBalancerConfiguration(threshold, bandwidthInMB, - parallelThread, - hosts.size() == 0 ? Optional.empty() : Optional.of(hosts)); + parallelThread, commonOptions.getSpecifiedDatanodes()); System.out.println("Update DiskBalancer Configuration on datanode(s):\n" + - (allHosts ? "All datanodes" : String.join("\n", hosts))); + commonOptions.getHostString()); if (errors.size() > 0) { for (DatanodeAdminError error : errors) { @@ -93,6 +82,6 @@ public class DiskBalancerUpdateSubcommand extends ScmSubcommand { @VisibleForTesting public void setAllHosts(boolean allHosts) { - this.allHosts = allHosts; + this.commonOptions.setAllHosts(allHosts); } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
