This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new cbad1202d09 HDDS-13406. Standardize option for OM address for `ozone
admin om` (#8918)
cbad1202d09 is described below
commit cbad1202d09a6953ec19ee31c5db138affea3eb9
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Mon Nov 17 10:14:28 2025 +0100
HDDS-13406. Standardize option for OM address for `ozone admin om` (#8918)
---
.../apache/hadoop/hdds/cli/AbstractSubcommand.java | 11 ++
.../org/apache/hadoop/hdds/cli/GenericCli.java | 1 +
.../hadoop/hdds/cli/GenericParentCommand.java | 5 +
hadoop-hdds/docs/content/tools/Admin.md | 33 ++--
.../ozone/admin/om/CancelPrepareSubCommand.java | 19 +--
.../ozone/admin/om/DecommissionOMSubcommand.java | 16 +-
.../hadoop/ozone/admin/om/FetchKeySubCommand.java | 12 +-
.../admin/om/FinalizationStatusSubCommand.java | 28 +--
.../ozone/admin/om/FinalizeUpgradeSubCommand.java | 25 +--
.../ozone/admin/om/GetServiceRolesSubcommand.java | 18 +-
.../ozone/admin/om/ListOpenFilesSubCommand.java | 41 ++---
.../org/apache/hadoop/ozone/admin/om/OMAdmin.java | 33 ++--
.../hadoop/ozone/admin/om/OmAddressOptions.java | 189 +++++++++++++++++++++
.../hadoop/ozone/admin/om/PrepareSubCommand.java | 24 +--
.../ozone/admin/om/TransferOmLeaderSubCommand.java | 20 +--
.../ozone/admin/om/UpdateRangerSubcommand.java | 31 +---
.../ozone/admin/om/snapshot/DefragSubCommand.java | 26 +--
.../admin/om/snapshot/SnapshotSubCommand.java | 8 -
.../ozone/om/snapshot/TestSnapshotDefragAdmin.java | 4 +-
pom.xml | 6 +-
20 files changed, 321 insertions(+), 229 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
index b7f7170c2ae..08d271d7f12 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/AbstractSubcommand.java
@@ -17,9 +17,11 @@
package org.apache.hadoop.hdds.cli;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.function.Supplier;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ratis.util.MemoizedSupplier;
import picocli.CommandLine;
@@ -66,6 +68,7 @@ static GenericParentCommand
findRootCommand(CommandLine.Model.CommandSpec spec)
private static class NoParentCommand implements GenericParentCommand {
private final OzoneConfiguration conf = new OzoneConfiguration();
+ private UserGroupInformation user;
@Override
public boolean isVerbose() {
@@ -77,6 +80,14 @@ public OzoneConfiguration getOzoneConf() {
return conf;
}
+ @Override
+ public UserGroupInformation getUser() throws IOException {
+ if (user == null) {
+ user = UserGroupInformation.getCurrentUser();
+ }
+ return user;
+ }
+
@Override
public void printError(Throwable t) {
t.printStackTrace();
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
index 23e2c3cd102..10bb8c4c43c 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericCli.java
@@ -110,6 +110,7 @@ public OzoneConfiguration getOzoneConf() {
return config;
}
+ @Override
public UserGroupInformation getUser() throws IOException {
if (user == null) {
user = UserGroupInformation.getCurrentUser();
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
index 68cf45e1786..80b7b4eeffa 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/cli/GenericParentCommand.java
@@ -17,7 +17,9 @@
package org.apache.hadoop.hdds.cli;
+import java.io.IOException;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.security.UserGroupInformation;
/**
* Interface to access the higher level parameters.
@@ -29,5 +31,8 @@ public interface GenericParentCommand {
/** Returns a cached configuration, i.e. it is created only once, subsequent
calls return the same instance. */
OzoneConfiguration getOzoneConf();
+ /** Returns a cached {@link UserGroupInformation} instance. */
+ UserGroupInformation getUser() throws IOException;
+
void printError(Throwable t);
}
diff --git a/hadoop-hdds/docs/content/tools/Admin.md
b/hadoop-hdds/docs/content/tools/Admin.md
index c2f6093180a..6dd480d43c3 100644
--- a/hadoop-hdds/docs/content/tools/Admin.md
+++ b/hadoop-hdds/docs/content/tools/Admin.md
@@ -115,7 +115,7 @@ Client ID Creation time Hsync'ed Open
File Path
111726338152071171 1704808626588 No
/volume-lof/buck1/-9223372036854774527/key2
To get the next batch of open keys, run:
- ozone admin om lof -id=om-service-test1 --length=3
--prefix=/volume-lof/buck1
--start=/-9223372036854775552/-9223372036854775040/-9223372036854774527/key2/111726338152071171
+ ozone admin om lof --service-id=om-service-test1 --length=3
--prefix=/volume-lof/buck1
--start=/-9223372036854775552/-9223372036854775040/-9223372036854774527/key2/111726338152071171
```
- In JSON, list open files (keys) under bucket `/volumelof/buck1` with a batch
size of 3:
@@ -183,21 +183,24 @@ This command only works on Ozone Manager HA clusters.
```bash
$ ozone admin om snapshot defrag --help
-Usage: ozone admin om snapshot defrag [-hV] [--no-wait] [--node-id=<nodeId>]
- [-id=<omServiceId>]
+Usage: ozone admin om snapshot defrag [-hV] [--no-wait] [--verbose]
+ [--node-id=<nodeId>]
+ [--service-id=<serviceID>]
Triggers the Snapshot Defragmentation Service to run immediately. This command
-manually initiates the snapshot defragmentation process which compacts
-snapshot data and removes fragmentation to improve storage efficiency. This
-command works only on OzoneManager HA cluster.
- -h, --help Show this help message and exit.
- --no-wait Do not wait for the defragmentation task to
- complete. The command will return immediately
- after triggering the task.
- --node-id=<nodeId> NodeID of the OM to trigger snapshot
- defragmentation on.
- -id, --service-id=<omServiceId>
- Ozone Manager Service ID
- -V, --version Print version information and exit.
+manually initiates the snapshot defragmentation process which compacts snapshot
+data and removes fragmentation to improve storage efficiency. This command
+works only on OzoneManager HA cluster.
+ -h, --help Show this help message and exit.
+ --no-wait Do not wait for the defragmentation task to
+ complete. The command will return immediately
+ after triggering the task.
+ --node-id=<nodeId> NodeID of the OM to trigger snapshot defragmentation
+ on.
+ --service-id, --om-service-id=<serviceID>
+ Ozone Manager Service ID.
+ -V, --version Print version information and exit.
+ --verbose More verbose output. Show the stack trace of the
+ errors.
```
### Example usages
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
index a62cc7f2594..e208c8cc927 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/CancelPrepareSubCommand.java
@@ -32,22 +32,17 @@
versionProvider = HddsVersionProvider.class
)
public class CancelPrepareSubCommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID",
- required = false
- )
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
@Override
public Void call() throws Exception {
- OzoneManagerProtocol client = parent.createOmClient(omServiceId);
- client.cancelOzoneManagerPrepare();
- System.out.println("Cancel prepare succeeded, cluster can now accept " +
- "write requests.");
+ try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+ client.cancelOzoneManagerPrepare();
+ System.out.println("Cancel prepare succeeded, cluster can now accept " +
+ "write requests.");
+ }
return null;
}
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
index 889038db63c..832c00d94dc 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/DecommissionOMSubcommand.java
@@ -42,7 +42,7 @@
*/
@CommandLine.Command(
name = "decommission",
- customSynopsis = "ozone admin om decommission -id=<om-service-id> " +
+ customSynopsis = "ozone admin om decommission --service-id=<om-service-id>
" +
"-nodeid=<decommission-om-node-id> " +
"-hostname=<decommission-om-node-address> [options]",
description = "Decommission an OzoneManager. Ensure that the node being " +
@@ -64,10 +64,8 @@ public class DecommissionOMSubcommand implements
Callable<Void> {
@CommandLine.ParentCommand
private OMAdmin parent;
- @CommandLine.Option(names = {"-id", "--service-id"},
- description = "OM Service ID",
- required = true)
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.MandatoryServiceIdMixin omServiceOption;
@CommandLine.Option(names = {"-nodeid", "--nodeid"},
description = "NodeID of the OM to be decommissioned.",
@@ -106,7 +104,7 @@ public Void call() throws IOException {
// leader.
try (OMAdminProtocolClientSideImpl omAdminProtocolClient =
OMAdminProtocolClientSideImpl.createProxyForOMHA(ozoneConf, user,
- omServiceId)) {
+ omServiceOption.getServiceID())) {
OMNodeDetails decommNodeDetails = new OMNodeDetails.Builder()
.setOMNodeId(decommNodeId)
.setHostAddress(hostInetAddress.getHostAddress())
@@ -127,7 +125,7 @@ public Void call() throws IOException {
*/
private void verifyNodeIdAndHostAddress() throws IOException {
String rpcAddrKey = ConfUtils.addKeySuffixes(OZONE_OM_ADDRESS_KEY,
- omServiceId, decommNodeId);
+ omServiceOption.getServiceID(), decommNodeId);
String rpcAddrStr = OmUtils.getOmRpcAddress(ozoneConf, rpcAddrKey);
if (rpcAddrStr == null || rpcAddrStr.isEmpty()) {
throw new IOException("There is no OM corresponding to " + decommNodeId
@@ -152,7 +150,7 @@ private void verifyNodeIdAndHostAddress() throws
IOException {
*/
private void verifyConfigUpdatedOnAllOMs() throws IOException {
String decommNodesKey = ConfUtils.addKeySuffixes(
- OZONE_OM_DECOMMISSIONED_NODES_KEY, omServiceId);
+ OZONE_OM_DECOMMISSIONED_NODES_KEY, omServiceOption.getServiceID());
Collection<String> decommNodes =
OmUtils.getDecommissionedNodeIds(ozoneConf, decommNodesKey);
if (!decommNodes.contains(decommNodeId)) {
@@ -165,7 +163,7 @@ private void verifyConfigUpdatedOnAllOMs() throws
IOException {
// decommissioned node is either removed from ozone.om.nodes config or
// added to ozone.om.decommissioned.nodes
List<OMNodeDetails> activeOMNodeDetails = OmUtils.getAllOMHAAddresses(
- ozoneConf, omServiceId, false);
+ ozoneConf, omServiceOption.getServiceID(), false);
if (activeOMNodeDetails.isEmpty()) {
throw new IOException("Cannot decommission OM " + decommNodeId + " as " +
"it is the only node in the ring.");
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
index 1497c266f56..21988604878 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FetchKeySubCommand.java
@@ -34,19 +34,13 @@
versionProvider = HddsVersionProvider.class
)
public class FetchKeySubCommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID",
- required = false
- )
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
@Override
public Void call() throws Exception {
- try (OzoneManagerProtocol client = parent.createOmClient(omServiceId)) {
+ try (OzoneManagerProtocol client = omServiceOption.newClient()) {
UUID uuid = client.refetchSecretKey();
System.out.println("Current Secret Key ID: " + uuid);
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
index dcde6618967..ef739454b65 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizationStatusSubCommand.java
@@ -35,29 +35,17 @@
)
public class FinalizationStatusSubCommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID"
- )
- private String omServiceId;
-
- @CommandLine.Option(
- names = {"-host", "--service-host"},
- description = "Ozone Manager Host"
- )
- private String omHost;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
@Override
public Void call() throws Exception {
- OzoneManagerProtocol client =
- parent.createOmClient(omServiceId, omHost, false);
- String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID().toString();
- UpgradeFinalization.StatusAndMessages progress =
- client.queryUpgradeFinalizationProgress(upgradeClientID, false, true);
- System.out.println(progress.status());
+ String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID();
+ try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
+ UpgradeFinalization.StatusAndMessages progress =
+ client.queryUpgradeFinalizationProgress(upgradeClientID, false,
true);
+ System.out.println(progress.status());
+ }
return null;
}
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
index 45dbaf55e4a..cc1f0b8b93e 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/FinalizeUpgradeSubCommand.java
@@ -56,20 +56,8 @@
)
public class FinalizeUpgradeSubCommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID"
- )
- private String omServiceId;
-
- @CommandLine.Option(
- names = {"-host", "--service-host"},
- description = "Ozone Manager Host"
- )
- private String omHost;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
@CommandLine.Option(
names = {"--takeover"},
@@ -80,11 +68,8 @@ public class FinalizeUpgradeSubCommand implements
Callable<Void> {
@Override
public Void call() throws Exception {
- boolean forceHA = false;
- OzoneManagerProtocol client =
- parent.createOmClient(omServiceId, omHost, forceHA);
- String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID().toString();
- try {
+ String upgradeClientID = "Upgrade-Client-" + UUID.randomUUID();
+ try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
UpgradeFinalization.StatusAndMessages finalizationResponse =
client.finalizeUpgrade(upgradeClientID);
if (isFinalized(finalizationResponse.status())) {
@@ -98,10 +83,10 @@ public Void call() throws Exception {
);
throw new IOException("Exiting...");
}
+ monitorAndWaitFinalization(client, upgradeClientID);
} catch (UpgradeException e) {
handleInvalidRequestAfterInitiatingFinalization(force, e);
}
- monitorAndWaitFinalization(client, upgradeClientID);
return null;
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
index 7d2f6962727..9b4da46e880 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
@@ -43,13 +43,8 @@
versionProvider = HddsVersionProvider.class)
public class GetServiceRolesSubcommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- @CommandLine.Option(names = {"-id", "--service-id"},
- description = "OM Service ID",
- required = false)
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
@CommandLine.Option(names = { "--json" },
defaultValue = "false",
@@ -61,8 +56,6 @@ public class GetServiceRolesSubcommand implements
Callable<Void> {
description = "Format output as Table")
private boolean table;
- private OzoneManagerProtocol ozoneManagerClient;
-
private static final String OM_ROLES_TITLE = "Ozone Manager Roles";
private static final List<String> OM_ROLES_HEADER = Arrays.asList(
@@ -70,8 +63,7 @@ public class GetServiceRolesSubcommand implements
Callable<Void> {
@Override
public Void call() throws Exception {
- try {
- ozoneManagerClient = parent.createOmClient(omServiceId);
+ try (OzoneManagerProtocol ozoneManagerClient =
omServiceOption.newClient()) {
if (json) {
printOmServerRolesAsJson(ozoneManagerClient.getServiceList());
} else if (table) {
@@ -90,10 +82,6 @@ public Void call() throws Exception {
} else {
printOmServerRoles(ozoneManagerClient.getServiceList());
}
- } finally {
- if (ozoneManagerClient != null) {
- ozoneManagerClient.close();
- }
}
return null;
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
index d299098db63..c5477e0cb0e 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/ListOpenFilesSubCommand.java
@@ -21,7 +21,6 @@
import java.time.Instant;
import java.util.List;
import java.util.concurrent.Callable;
-import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.hdds.server.JsonUtils;
import org.apache.hadoop.ozone.OzoneConsts;
@@ -49,20 +48,8 @@ public class ListOpenFilesSubCommand implements
Callable<Void> {
@CommandLine.ParentCommand
private OMAdmin parent;
- @CommandLine.Option(
- names = {"--service-id", "--om-service-id"},
- description = "Ozone Manager Service ID",
- required = false
- )
- private String omServiceId;
-
- @CommandLine.Option(
- names = {"--service-host"},
- description = "Ozone Manager Host. If OM HA is enabled, use --service-id
instead. "
- + "If you must use --service-host with OM HA, this must point
directly to the leader OM. "
- + "This option is required when --service-id is not provided or when
HA is not enabled."
- )
- private String omHost;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
@CommandLine.Option(names = { "--json" },
defaultValue = "false",
@@ -106,20 +93,20 @@ public class ListOpenFilesSubCommand implements
Callable<Void> {
@Override
public Void call() throws Exception {
-
- if (StringUtils.isEmpty(omServiceId) && StringUtils.isEmpty(omHost)) {
- System.err.println("Error: Please specify --service-id or
--service-host");
- return null;
+ try (OzoneManagerProtocol omClient = omAddressOptions.newClient()) {
+ execute(omClient);
}
- OzoneManagerProtocol ozoneManagerClient =
- parent.createOmClient(omServiceId, omHost, false);
+ return null;
+ }
+
+ private void execute(OzoneManagerProtocol ozoneManagerClient) throws
IOException {
ServiceInfoEx serviceInfoEx = ozoneManagerClient.getServiceInfo();
final OzoneManagerVersion omVersion =
RpcClient.getOmVersion(serviceInfoEx);
if (omVersion.compareTo(OzoneManagerVersion.HBASE_SUPPORT) < 0) {
System.err.println("Error: This command requires OzoneManager version "
+ OzoneManagerVersion.HBASE_SUPPORT.name() + " or later.");
- return null;
+ return;
}
ListOpenFilesResult res =
@@ -138,8 +125,6 @@ public Void call() throws Exception {
// Human friendly output
printOpenKeysList(res);
}
-
- return null;
}
private void printOpenKeysListAsJson(ListOpenFilesResult res)
@@ -237,13 +222,7 @@ private String getMessageString(ListOpenFilesResult res,
List<OpenKeySession> op
* @return the command to get the next batch of open keys
*/
private String getCmdForNextBatch(String lastElementFullPath) {
- String nextBatchCmd = "ozone admin om lof";
- if (omServiceId != null && !omServiceId.isEmpty()) {
- nextBatchCmd += " -id=" + omServiceId;
- }
- if (omHost != null && !omHost.isEmpty()) {
- nextBatchCmd += " -host=" + omHost;
- }
+ String nextBatchCmd = "ozone admin om lof " + omAddressOptions;
if (json) {
nextBatchCmd += " --json";
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
index e096a55b95c..b81dd0f7ce5 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OMAdmin.java
@@ -20,6 +20,7 @@
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_ADDRESS_KEY;
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SERVICE_IDS_KEY;
+import java.io.IOException;
import java.util.Collection;
import org.apache.hadoop.hdds.cli.AdminSubcommand;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
@@ -37,6 +38,7 @@
import org.apache.hadoop.ozone.om.protocolPB.OmTransport;
import
org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolClientSideTranslatorPB;
import org.apache.hadoop.ozone.om.protocolPB.OzoneManagerProtocolPB;
+import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ratis.protocol.ClientId;
import org.kohsuke.MetaInfServices;
import picocli.CommandLine;
@@ -88,29 +90,32 @@ public ClientProtocol createClient(String omServiceId)
throws Exception {
}
public OzoneManagerProtocolClientSideTranslatorPB createOmClient(
- String omServiceID
+ String omServiceID,
+ String omHost,
+ boolean forceHA
) throws Exception {
- return createOmClient(omServiceID, null, true);
+ return createOmClient(parent.getOzoneConf(), parent.getUser(),
omServiceID, omHost, forceHA);
}
- public OzoneManagerProtocolClientSideTranslatorPB createOmClient(
+ public static OzoneManagerProtocolClientSideTranslatorPB createOmClient(
+ OzoneConfiguration conf,
+ UserGroupInformation ugi,
String omServiceID,
String omHost,
boolean forceHA
- ) throws Exception {
- OzoneConfiguration conf = parent.getOzoneConf();
+ ) throws IOException {
if (omHost != null && !omHost.isEmpty()) {
omServiceID = null;
conf.set(OZONE_OM_ADDRESS_KEY, omHost);
} else if (omServiceID == null || omServiceID.isEmpty()) {
- omServiceID = getTheOnlyConfiguredOmServiceIdOrThrow();
+ omServiceID = getTheOnlyConfiguredOmServiceIdOrThrow(conf);
}
RPC.setProtocolEngine(conf, OzoneManagerProtocolPB.class,
ProtobufRpcEngine.class);
String clientId = ClientId.randomId().toString();
if (!forceHA || (forceHA && OmUtils.isOmHAServiceId(conf, omServiceID))) {
OmTransport omTransport = new Hadoop3OmTransportFactory()
- .createOmTransport(conf, parent.getUser(), omServiceID);
+ .createOmTransport(conf, ugi, omServiceID);
return new OzoneManagerProtocolClientSideTranslatorPB(omTransport,
clientId);
} else {
@@ -122,19 +127,17 @@ public OzoneManagerProtocolClientSideTranslatorPB
createOmClient(
}
}
- private String getTheOnlyConfiguredOmServiceIdOrThrow() {
- if (getConfiguredServiceIds().size() != 1) {
+ private static String
getTheOnlyConfiguredOmServiceIdOrThrow(OzoneConfiguration conf) {
+ Collection<String> configuredServiceIds = getConfiguredServiceIds(conf);
+ if (configuredServiceIds.size() != 1) {
throw new IllegalArgumentException("There is no Ozone Manager service ID
"
+ "specified, but there are either zero, or more than one service ID"
+ "configured.");
}
- return getConfiguredServiceIds().iterator().next();
+ return configuredServiceIds.iterator().next();
}
- private Collection<String> getConfiguredServiceIds() {
- OzoneConfiguration conf = parent.getOzoneConf();
- Collection<String> omServiceIds =
- conf.getTrimmedStringCollection(OZONE_OM_SERVICE_IDS_KEY);
- return omServiceIds;
+ private static Collection<String> getConfiguredServiceIds(OzoneConfiguration
conf) {
+ return conf.getTrimmedStringCollection(OZONE_OM_SERVICE_IDS_KEY);
}
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
new file mode 100644
index 00000000000..b5336ec8940
--- /dev/null
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/OmAddressOptions.java
@@ -0,0 +1,189 @@
+/*
+ * 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.ozone.admin.om;
+
+import static org.apache.hadoop.ozone.admin.om.OMAdmin.createOmClient;
+
+import java.io.IOException;
+import java.util.Objects;
+import org.apache.hadoop.hdds.cli.AbstractMixin;
+import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
+import picocli.CommandLine;
+
+/** Defines command-line options for OM address, whether service or single
host. */
+public final class OmAddressOptions {
+
+ /** Base class for service ID mixins. */
+ protected abstract static class AbstractServiceIdMixin extends AbstractMixin
{
+ protected abstract ServiceIdOptions addressOptions();
+
+ public String getServiceID() {
+ ServiceIdOptions opts = addressOptions();
+ return opts != null ? opts.getServiceID() : null;
+ }
+
+ public OzoneManagerProtocol newClient() throws IOException {
+ return createOmClient(
+ getOzoneConf(),
+ rootCommand().getUser(),
+ getServiceID(),
+ null,
+ true);
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toString(addressOptions(), "");
+ }
+ }
+
+ /** Adds host to mixin. */
+ protected abstract static class AbstractServiceIdOrHostMixin extends
AbstractServiceIdMixin {
+ @Override
+ protected abstract ServiceIdAndHostOptions addressOptions();
+
+ public String getHost() {
+ ServiceIdAndHostOptions opts = addressOptions();
+ return opts != null ? opts.getHost() : null;
+ }
+
+ @Override
+ public OzoneManagerProtocol newClient() throws IOException {
+ return createOmClient(
+ getOzoneConf(),
+ rootCommand().getUser(),
+ getServiceID(),
+ getHost(),
+ false);
+ }
+ }
+
+ /** Optionally specify OM service ID. */
+ public static class OptionalServiceIdMixin extends AbstractServiceIdMixin {
+ @CommandLine.ArgGroup // exclusive=true, multiplicity=0..1
+ private ServiceIdOptions opts;
+
+ @Override
+ protected ServiceIdOptions addressOptions() {
+ return opts;
+ }
+ }
+
+ /** Require OM service ID. */
+ public static class MandatoryServiceIdMixin extends AbstractServiceIdMixin {
+ @CommandLine.ArgGroup(multiplicity = "1") // exclusive=true
+ private ServiceIdOptions opts;
+
+ @Override
+ protected ServiceIdOptions addressOptions() {
+ return opts;
+ }
+ }
+
+ /** Optionally specify OM service ID or host. */
+ public static class OptionalServiceIdOrHostMixin extends
AbstractServiceIdOrHostMixin {
+ @CommandLine.ArgGroup // exclusive=true, multiplicity=0..1
+ private ServiceIdAndHostOptions opts;
+
+ @Override
+ protected ServiceIdAndHostOptions addressOptions() {
+ return opts;
+ }
+ }
+
+ /** Require OM service ID or host. */
+ public static class MandatoryServiceIdOrHostMixin extends
AbstractServiceIdOrHostMixin {
+ @CommandLine.ArgGroup(multiplicity = "1") // exclusive=true
+ private ServiceIdAndHostOptions opts;
+
+ @Override
+ protected ServiceIdAndHostOptions addressOptions() {
+ return opts;
+ }
+ }
+
+ /** Options for OM service ID. */
+ protected static class ServiceIdOptions {
+ @CommandLine.Option(
+ names = {"--service-id", "--om-service-id"},
+ description = "Ozone Manager Service ID.",
+ required = true
+ )
+ private String serviceID;
+
+ /** For backward compatibility. */
+ @CommandLine.Option(
+ names = {"-id"},
+ hidden = true,
+ required = true
+ )
+ @Deprecated
+ @SuppressWarnings("DeprecatedIsStillUsed")
+ private String deprecatedID;
+
+ public String getServiceID() {
+ if (serviceID != null) {
+ return serviceID;
+ }
+ return deprecatedID;
+ }
+
+ @Override
+ public String toString() {
+ String value = getServiceID();
+ return value != null && !value.isEmpty() ? "--om-service-id " + value :
"";
+ }
+ }
+
+ /** Add options for OM host. */
+ protected static class ServiceIdAndHostOptions extends ServiceIdOptions {
+ @CommandLine.Option(
+ names = {"--service-host"},
+ description = "Ozone Manager Host.",
+ required = true
+ )
+ private String host;
+
+ /** For backward compatibility. */
+ @CommandLine.Option(
+ names = {"-host"},
+ hidden = true,
+ required = true
+ )
+ @Deprecated
+ @SuppressWarnings("DeprecatedIsStillUsed")
+ private String deprecatedHost;
+
+ public String getHost() {
+ return host != null ? host : deprecatedHost;
+ }
+
+ @Override
+ public String toString() {
+ final String serviceOpt = super.toString();
+ final String hostValue = getHost();
+ return (hostValue != null && !hostValue.isEmpty())
+ ? serviceOpt + " --service-host " + hostValue
+ : serviceOpt;
+ }
+ }
+
+ private OmAddressOptions() {
+ // no instances
+ }
+}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
index fd6b2ec0a41..a0eabd4b7d1 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/PrepareSubCommand.java
@@ -36,7 +36,7 @@
import picocli.CommandLine;
/**
- * Handler of ozone admin om finalizeUpgrade command.
+ * Handler of ozone admin om prepare command.
*/
@CommandLine.Command(
name = "prepare",
@@ -53,12 +53,8 @@ public class PrepareSubCommand implements Callable<Void> {
@CommandLine.ParentCommand
private OMAdmin parent;
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID",
- required = true
- )
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.MandatoryServiceIdMixin omServiceOption;
@CommandLine.Option(
names = {"-tawt", "--transaction-apply-wait-timeout"},
@@ -97,7 +93,13 @@ public class PrepareSubCommand implements Callable<Void> {
@Override
public Void call() throws Exception {
- OzoneManagerProtocol client = parent.createOmClient(omServiceId);
+ try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+ execute(client);
+ }
+ return null;
+ }
+
+ private void execute(OzoneManagerProtocol client) throws Exception {
long prepareTxnId = client.prepareOzoneManager(txnApplyWaitTimeSeconds,
txnApplyCheckIntervalSeconds);
System.out.println("Ozone Manager Prepare Request successfully returned " +
@@ -105,7 +107,7 @@ public Void call() throws Exception {
Map<String, Boolean> omPreparedStatusMap = new HashMap<>();
Set<String> omHosts = getOmHostsFromConfig(
- parent.getParent().getOzoneConf(), omServiceId);
+ parent.getParent().getOzoneConf(), omServiceOption.getServiceID());
omHosts.forEach(h -> omPreparedStatusMap.put(h, false));
Duration pTimeout = Duration.of(prepareTimeOut, ChronoUnit.SECONDS);
Duration pInterval = Duration.of(prepareCheckInterval, ChronoUnit.SECONDS);
@@ -122,7 +124,7 @@ public Void call() throws Exception {
if (!e.getValue()) {
String omHost = e.getKey();
try (OzoneManagerProtocol singleOmClient =
- parent.createOmClient(omServiceId, omHost, false)) {
+ parent.createOmClient(omServiceOption.getServiceID(),
omHost, false)) {
PrepareStatusResponse response =
singleOmClient.getOzoneManagerPrepareStatus(prepareTxnId);
PrepareStatus status = response.getStatus();
@@ -165,8 +167,6 @@ public Void call() throws Exception {
System.out.println("No new write requests will be allowed until " +
"preparation is cancelled or upgrade/downgrade is done.");
}
-
- return null;
}
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
index c676b87bf3c..069e10c1343 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/TransferOmLeaderSubCommand.java
@@ -33,14 +33,8 @@
)
public class TransferOmLeaderSubCommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID."
- )
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
@CommandLine.ArgGroup(multiplicity = "1")
private TransferOption configGroup;
@@ -59,14 +53,14 @@ static class TransferOption {
@Override
public Void call() throws Exception {
- OzoneManagerProtocol client =
- parent.createOmClient(omServiceId, null, true);
if (configGroup.isRandom) {
configGroup.omNodeId = "";
}
- client.transferLeadership(configGroup.omNodeId);
- System.out.println("Transfer leadership successfully to " +
- (configGroup.isRandom ? "random node" : configGroup.omNodeId) + ".");
+ try (OzoneManagerProtocol client = omServiceOption.newClient()) {
+ client.transferLeadership(configGroup.omNodeId);
+ System.out.println("Transfer leadership successfully to " +
+ (configGroup.isRandom ? "random node" : configGroup.omNodeId) + ".");
+ }
return null;
}
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
index 22f59e64a67..fdca290aada 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.admin.om;
import java.util.concurrent.Callable;
-import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
import picocli.CommandLine;
@@ -39,24 +38,8 @@
versionProvider = HddsVersionProvider.class)
public class UpdateRangerSubcommand implements Callable<Void> {
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- @CommandLine.Option(
- names = {"-id", "--service-id", "--om-service-id"},
- description = "Ozone Manager Service ID"
- )
- private String omServiceId;
-
- @CommandLine.Option(
- names = {"-host", "--service-host"},
- description = "Ozone Manager Host. If OM HA is enabled, use -id instead.
"
- + "If insists on using -host with OM HA, this must point directly "
- + "to the leader OM. "
- + "This option is required when -id is not provided or "
- + "when HA is not enabled."
- )
- private String omHost;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdOrHostMixin omAddressOptions;
@CommandLine.Option(names = {"--no-wait"},
description = "Do not wait for task completion. Exit immediately "
@@ -65,15 +48,7 @@ public class UpdateRangerSubcommand implements
Callable<Void> {
@Override
public Void call() throws Exception {
-
- if (StringUtils.isEmpty(omServiceId) && StringUtils.isEmpty(omHost)) {
- System.err.println("Error: Please specify -id or -host");
- return null;
- }
-
- boolean forceHA = false;
- try (OzoneManagerProtocol client = parent.createOmClient(
- omServiceId, omHost, forceHA)) {
+ try (OzoneManagerProtocol client = omAddressOptions.newClient()) {
boolean res = client.triggerRangerBGSync(noWait);
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
index 6062353d60b..2f6d35260cd 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/DefragSubCommand.java
@@ -19,9 +19,10 @@
import java.io.IOException;
import java.util.concurrent.Callable;
+import org.apache.hadoop.hdds.cli.AbstractSubcommand;
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.admin.om.OMAdmin;
+import org.apache.hadoop.ozone.admin.om.OmAddressOptions;
import org.apache.hadoop.ozone.om.helpers.OMNodeDetails;
import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolClientSideImpl;
import org.apache.hadoop.security.UserGroupInformation;
@@ -40,16 +41,10 @@
mixinStandardHelpOptions = true,
versionProvider = HddsVersionProvider.class
)
-public class DefragSubCommand implements Callable<Void> {
+public class DefragSubCommand extends AbstractSubcommand implements
Callable<Void> {
- @CommandLine.ParentCommand
- private SnapshotSubCommand parent;
-
- @CommandLine.Option(
- names = {"-id", "--service-id"},
- description = "Ozone Manager Service ID"
- )
- private String omServiceId;
+ @CommandLine.Mixin
+ private OmAddressOptions.OptionalServiceIdMixin omServiceOption;
@CommandLine.Option(
names = {"--node-id"},
@@ -68,11 +63,9 @@ public class DefragSubCommand implements Callable<Void> {
@Override
public Void call() throws Exception {
- // Navigate up to get OMAdmin
- OMAdmin omAdmin = getOMAdmin();
- OzoneConfiguration conf = omAdmin.getParent().getOzoneConf();
+ OzoneConfiguration conf = getOzoneConf();
OMNodeDetails omNodeDetails = OMNodeDetails.getOMNodeDetailsFromConf(
- conf, omServiceId, nodeId);
+ conf, omServiceOption.getServiceID(), nodeId);
if (omNodeDetails == null) {
System.err.println("Error: OMNodeDetails could not be determined with
given " +
@@ -113,9 +106,4 @@ protected void execute(OMAdminProtocolClientSideImpl
omAdminProtocolClient)
}
}
}
-
- private OMAdmin getOMAdmin() {
- // The parent hierarchy is: DefragSubCommand -> SnapshotSubCommand ->
OMAdmin
- return parent.getParent();
- }
}
diff --git
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
index 48ca9e365ff..7aa2e3edb78 100644
---
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
+++
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/snapshot/SnapshotSubCommand.java
@@ -17,7 +17,6 @@
package org.apache.hadoop.ozone.admin.om.snapshot;
-import org.apache.hadoop.ozone.admin.om.OMAdmin;
import picocli.CommandLine;
/**
@@ -31,11 +30,4 @@
}
)
public class SnapshotSubCommand {
-
- @CommandLine.ParentCommand
- private OMAdmin parent;
-
- public OMAdmin getParent() {
- return parent;
- }
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
index dff56a35d16..5153caf5a23 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDefragAdmin.java
@@ -179,7 +179,7 @@ private void executeDefragCommand(String nodeId, boolean
noWait) throws Exceptio
"om",
"snapshot",
"defrag",
- "-id", omServiceId,
+ "--service-id", omServiceId,
"--node-id", nodeId,
"--no-wait"
};
@@ -188,7 +188,7 @@ private void executeDefragCommand(String nodeId, boolean
noWait) throws Exceptio
"om",
"snapshot",
"defrag",
- "-id", omServiceId,
+ "--service-id", omServiceId,
"--node-id", nodeId
};
}
diff --git a/pom.xml b/pom.xml
index b960a94ac6a..d2ec8243145 100644
--- a/pom.xml
+++ b/pom.xml
@@ -183,7 +183,11 @@
<os-maven-plugin.version>1.7.1</os-maven-plugin.version>
<ozone.release>Katmai</ozone.release>
<ozone.version>2.2.0-SNAPSHOT</ozone.version>
- <picocli.version>4.7.7</picocli.version>
+ <!--
+ 4.7.6: https://github.com/remkop/picocli/issues/2309
+ 4.7.7: https://github.com/remkop/picocli/issues/2407
+ -->
+ <picocli.version>4.7.5</picocli.version>
<plexus-archiver.version>4.2.2</plexus-archiver.version>
<pmd.version>3.26.0</pmd.version>
<!-- Enable Reproducible Builds mode -->
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]