This is an automated email from the ASF dual-hosted git repository. ayegorov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push: new b7128977d4 Fix bookie shell help command exception b7128977d4 is described below commit b7128977d466c6e113b1d576b88d9f1e70689ad7 Author: Hang Chen <chenh...@apache.org> AuthorDate: Tue Apr 26 06:35:16 2022 +0800 Fix bookie shell help command exception ### Motivation When run `bin/bookkeeper shell ledgermetadata -h` command, it throw the following exception. ``` 23:02:41,236 ERROR Error parsing command line arguments : org.apache.commons.cli.UnrecognizedOptionException: Unrecognized option: -h at org.apache.commons.cli.Parser.processOption(Parser.java:363) ~[commons-cli-commons-cli-1.2.jar:1.2] at org.apache.commons.cli.Parser.parse(Parser.java:199) ~[commons-cli-commons-cli-1.2.jar:1.2] at org.apache.commons.cli.Parser.parse(Parser.java:85) ~[commons-cli-commons-cli-1.2.jar:1.2] at org.apache.bookkeeper.bookie.BookieShell$MyCommand.runCmd(BookieShell.java:240) ~[org.apache.bookkeeper-bookkeeper-server-4.16.0-SNAPSHOT.jar:4.16.0-SNAPSHOT] at org.apache.bookkeeper.bookie.BookieShell.run(BookieShell.java:2372) ~[org.apache.bookkeeper-bookkeeper-server-4.16.0-SNAPSHOT.jar:4.16.0-SNAPSHOT] at org.apache.bookkeeper.bookie.BookieShell.main(BookieShell.java:2463) ~[org.apache.bookkeeper-bookkeeper-server-4.16.0-SNAPSHOT.jar:4.16.0-SNAPSHOT] ledgermetadata: Print the metadata for a ledger, or optionally dump to a file. usage: ledgermetadata -ledgerid <ledgerid> [--dump-to-file FILENAME|--restore-from-file FILENAME] -dumptofile <arg> Dump metadata for ledger, to a file -l,--ledgerid <arg> Ledger ID -restorefromfile <arg> Restore metadata for ledger, from a file ``` ### Changes Add `-h` and `--help` support. Reviewers: Enrico Olivelli <eolive...@gmail.com>, ZhangJian He <shoot...@gmail.com>, Andrey Yegorov <None> This closes #3227 from hangc0276/chenhang/fix_bookieshell_help_exception --- .../org/apache/bookkeeper/bookie/BookieShell.java | 153 +++++++++------------ 1 file changed, 63 insertions(+), 90 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java index ad7e8dbc15..80ce07164c 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java @@ -222,9 +222,11 @@ public class BookieShell implements Tool { abstract int runCmd(CommandLine cmdLine) throws Exception; String cmdName; + Options opts; MyCommand(String cmdName) { this.cmdName = cmdName; + opts = getOptionsWithHelp(); } @Override @@ -238,6 +240,10 @@ public class BookieShell implements Tool { try { BasicParser parser = new BasicParser(); CommandLine cmdLine = parser.parse(getOptions(), args); + if (cmdLine.hasOption("help")) { + printUsage(); + return 0; + } return runCmd(cmdLine); } catch (ParseException e) { LOG.error("Error parsing command line arguments : ", e); @@ -252,13 +258,18 @@ public class BookieShell implements Tool { System.err.println(cmdName + ": " + getDescription()); hf.printHelp(getUsage(), getOptions()); } + + private Options getOptionsWithHelp() { + Options opts = new Options(); + opts.addOption("h", "help", false, "Show the help"); + return opts; + } } /** * Format the bookkeeper metadata present in zookeeper. */ class MetaFormatCmd extends MyCommand { - Options opts = new Options(); MetaFormatCmd() { super(CMD_METAFORMAT); @@ -308,7 +319,6 @@ public class BookieShell implements Tool { * already existing. */ class InitNewCluster extends MyCommand { - Options opts = new Options(); InitNewCluster() { super(CMD_INITNEWCLUSTER); @@ -343,7 +353,6 @@ public class BookieShell implements Tool { * Nuke bookkeeper metadata of existing cluster in zookeeper. */ class NukeExistingCluster extends MyCommand { - Options opts = new Options(); NukeExistingCluster() { super(CMD_NUKEEXISTINGCLUSTER); @@ -388,7 +397,6 @@ public class BookieShell implements Tool { * Formats the local data present in current bookie server. */ class BookieFormatCmd extends MyCommand { - Options opts = new Options(); public BookieFormatCmd() { super(CMD_BOOKIEFORMAT); @@ -436,7 +444,6 @@ public class BookieShell implements Tool { * indexDirs are empty and there is no registered Bookie with this BookieId. */ class InitBookieCmd extends MyCommand { - Options opts = new Options(); public InitBookieCmd() { super(CMD_INITBOOKIE); @@ -470,7 +477,6 @@ public class BookieShell implements Tool { * Recover command for ledger data recovery for failed bookie. */ class RecoverCmd extends MyCommand { - Options opts = new Options(); public RecoverCmd() { super(CMD_RECOVER); @@ -539,11 +545,10 @@ public class BookieShell implements Tool { * Ledger Command Handles ledger related operations. */ class LedgerCmd extends MyCommand { - Options lOpts = new Options(); LedgerCmd() { super(CMD_LEDGER); - lOpts.addOption("m", "meta", false, "Print meta information"); + opts.addOption("m", "meta", false, "Print meta information"); } @Override @@ -571,7 +576,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -579,22 +584,21 @@ public class BookieShell implements Tool { * Command for reading ledger entries. */ class ReadLedgerEntriesCmd extends MyCommand { - Options lOpts = new Options(); ReadLedgerEntriesCmd() { super(CMD_READ_LEDGER_ENTRIES); - lOpts.addOption("m", "msg", false, "Print message body"); - lOpts.addOption("l", "ledgerid", true, "Ledger ID"); - lOpts.addOption("fe", "firstentryid", true, "First EntryID"); - lOpts.addOption("le", "lastentryid", true, "Last EntryID"); - lOpts.addOption("r", "force-recovery", false, + opts.addOption("m", "msg", false, "Print message body"); + opts.addOption("l", "ledgerid", true, "Ledger ID"); + opts.addOption("fe", "firstentryid", true, "First EntryID"); + opts.addOption("le", "lastentryid", true, "Last EntryID"); + opts.addOption("r", "force-recovery", false, "Ensure the ledger is properly closed before reading"); - lOpts.addOption("b", "bookie", true, "Only read from a specific bookie"); + opts.addOption("b", "bookie", true, "Only read from a specific bookie"); } @Override Options getOptions() { - return lOpts; + return opts; } @Override @@ -643,7 +647,6 @@ public class BookieShell implements Tool { * Command for listing underreplicated ledgers. */ class ListUnderreplicatedCmd extends MyCommand { - Options opts = new Options(); public ListUnderreplicatedCmd() { super(CMD_LISTUNDERREPLICATED); @@ -695,12 +698,11 @@ public class BookieShell implements Tool { * Command to list all ledgers in the cluster. */ class ListLedgersCmd extends MyCommand { - Options lOpts = new Options(); ListLedgersCmd() { super(CMD_LISTLEDGERS); - lOpts.addOption("m", "meta", false, "Print metadata"); - lOpts.addOption("bookieid", true, "List ledgers residing in this bookie"); + opts.addOption("m", "meta", false, "Print metadata"); + opts.addOption("bookieid", true, "List ledgers residing in this bookie"); } @Override @@ -728,7 +730,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -736,12 +738,11 @@ public class BookieShell implements Tool { * List active ledgers on entry log file. **/ class ListActiveLedgersCmd extends MyCommand { - Options lOpts = new Options(); ListActiveLedgersCmd() { super(CMD_ACTIVE_LEDGERS_ON_ENTRY_LOG_FILE); - lOpts.addOption("l", "logId", true, "Entry log file id"); - lOpts.addOption("t", "timeout", true, "Read timeout(ms)"); + opts.addOption("l", "logId", true, "Entry log file id"); + opts.addOption("t", "timeout", true, "Read timeout(ms)"); } @Override @@ -775,7 +776,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -790,13 +791,12 @@ public class BookieShell implements Tool { * Print the metadata for a ledger. */ class LedgerMetadataCmd extends MyCommand { - Options lOpts = new Options(); LedgerMetadataCmd() { super(CMD_LEDGERMETADATA); - lOpts.addOption("l", "ledgerid", true, "Ledger ID"); - lOpts.addOption("dumptofile", true, "Dump metadata for ledger, to a file"); - lOpts.addOption("restorefromfile", true, "Restore metadata for ledger, from a file"); + opts.addOption("l", "ledgerid", true, "Ledger ID"); + opts.addOption("dumptofile", true, "Dump metadata for ledger, to a file"); + opts.addOption("restorefromfile", true, "Restore metadata for ledger, from a file"); } @Override @@ -837,7 +837,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -845,7 +845,6 @@ public class BookieShell implements Tool { * Check local storage for inconsistencies. */ class LocalConsistencyCheck extends MyCommand { - Options lOpts = new Options(); LocalConsistencyCheck() { super(CMD_LOCALCONSISTENCYCHECK); @@ -870,7 +869,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -878,14 +877,13 @@ public class BookieShell implements Tool { * Simple test to create a ledger and write to it. */ class SimpleTestCmd extends MyCommand { - Options lOpts = new Options(); SimpleTestCmd() { super(CMD_SIMPLETEST); - lOpts.addOption("e", "ensemble", true, "Ensemble size (default 3)"); - lOpts.addOption("w", "writeQuorum", true, "Write quorum size (default 2)"); - lOpts.addOption("a", "ackQuorum", true, "Ack quorum size (default 2)"); - lOpts.addOption("n", "numEntries", true, "Entries to write (default 1000)"); + opts.addOption("e", "ensemble", true, "Ensemble size (default 3)"); + opts.addOption("w", "writeQuorum", true, "Write quorum size (default 2)"); + opts.addOption("a", "ackQuorum", true, "Ack quorum size (default 2)"); + opts.addOption("n", "numEntries", true, "Entries to write (default 1000)"); } @Override @@ -919,7 +917,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -927,17 +925,16 @@ public class BookieShell implements Tool { * Command to run a bookie sanity test. */ class BookieSanityTestCmd extends MyCommand { - Options lOpts = new Options(); BookieSanityTestCmd() { super(CMD_BOOKIESANITYTEST); - lOpts.addOption("e", "entries", true, "Total entries to be added for the test (default 10)"); - lOpts.addOption("t", "timeout", true, "Timeout for write/read operations in seconds (default 1)"); + opts.addOption("e", "entries", true, "Total entries to be added for the test (default 10)"); + opts.addOption("t", "timeout", true, "Timeout for write/read operations in seconds (default 1)"); } @Override Options getOptions() { - return lOpts; + return opts; } @Override @@ -963,15 +960,14 @@ public class BookieShell implements Tool { * Command to read entry log files. */ class ReadLogCmd extends MyCommand { - Options rlOpts = new Options(); ReadLogCmd() { super(CMD_READLOG); - rlOpts.addOption("m", "msg", false, "Print message body"); - rlOpts.addOption("l", "ledgerid", true, "Ledger ID"); - rlOpts.addOption("e", "entryid", true, "Entry ID"); - rlOpts.addOption("sp", "startpos", true, "Start Position"); - rlOpts.addOption("ep", "endpos", true, "End Position"); + opts.addOption("m", "msg", false, "Print message body"); + opts.addOption("l", "ledgerid", true, "Ledger ID"); + opts.addOption("e", "entryid", true, "Entry ID"); + opts.addOption("sp", "startpos", true, "Start Position"); + opts.addOption("ep", "endpos", true, "End Position"); } @Override @@ -1023,7 +1019,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return rlOpts; + return opts; } } @@ -1031,7 +1027,6 @@ public class BookieShell implements Tool { * Command to print metadata of entrylog. */ class ReadLogMetadataCmd extends MyCommand { - Options rlOpts = new Options(); ReadLogMetadataCmd() { super(CMD_READLOGMETADATA); @@ -1072,7 +1067,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return rlOpts; + return opts; } } @@ -1080,12 +1075,11 @@ public class BookieShell implements Tool { * Command to read journal files. */ class ReadJournalCmd extends MyCommand { - Options rjOpts = new Options(); ReadJournalCmd() { super(CMD_READJOURNAL); - rjOpts.addOption("dir", true, "Journal directory (needed if more than one journal configured)"); - rjOpts.addOption("m", "msg", false, "Print message body"); + opts.addOption("dir", true, "Journal directory (needed if more than one journal configured)"); + opts.addOption("m", "msg", false, "Print message body"); } @Override @@ -1130,7 +1124,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return rjOpts; + return opts; } } @@ -1161,7 +1155,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return new Options(); + return opts; } } @@ -1169,7 +1163,6 @@ public class BookieShell implements Tool { * List available bookies. */ class ListBookiesCmd extends MyCommand { - Options opts = new Options(); ListBookiesCmd() { super(CMD_LISTBOOKIES); @@ -1231,7 +1224,6 @@ public class BookieShell implements Tool { } class ListDiskFilesCmd extends MyCommand { - Options opts = new Options(); ListDiskFilesCmd() { super(CMD_LISTFILESONDISC); @@ -1308,7 +1300,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return new Options(); + return opts; } } @@ -1316,7 +1308,6 @@ public class BookieShell implements Tool { * Command for administration of autorecovery. */ class AutoRecoveryCmd extends MyCommand { - Options opts = new Options(); public AutoRecoveryCmd() { super(CMD_AUTORECOVERY); @@ -1360,7 +1351,6 @@ public class BookieShell implements Tool { * Command to query autorecovery status. */ class QueryAutoRecoveryStatusCmd extends MyCommand { - Options opts = new Options(); public QueryAutoRecoveryStatusCmd() { super(CMD_QUERY_AUTORECOVERY_STATUS); @@ -1396,7 +1386,6 @@ public class BookieShell implements Tool { * Setter and Getter for LostBookieRecoveryDelay value (in seconds) in metadata store. */ class LostBookieRecoveryDelayCmd extends MyCommand { - Options opts = new Options(); public LostBookieRecoveryDelayCmd() { super(CMD_LOSTBOOKIERECOVERYDELAY); @@ -1440,7 +1429,6 @@ public class BookieShell implements Tool { * Print which node has the auditor lock. */ class WhoIsAuditorCmd extends MyCommand { - Options opts = new Options(); public WhoIsAuditorCmd() { super(CMD_WHOISAUDITOR); @@ -1474,7 +1462,6 @@ public class BookieShell implements Tool { * Prints the instanceid of the cluster. */ class WhatIsInstanceId extends MyCommand { - Options opts = new Options(); public WhatIsInstanceId() { super(CMD_WHATISINSTANCEID); @@ -1507,7 +1494,6 @@ public class BookieShell implements Tool { * Update cookie command. */ class UpdateCookieCmd extends MyCommand { - Options opts = new Options(); private static final String BOOKIEID = "bookieId"; private static final String EXPANDSTORAGE = "expandstorage"; private static final String LIST = "list"; @@ -1594,7 +1580,6 @@ public class BookieShell implements Tool { * Update ledger command. */ class UpdateLedgerCmd extends MyCommand { - private final Options opts = new Options(); UpdateLedgerCmd() { super(CMD_UPDATELEDGER); @@ -1670,7 +1655,6 @@ public class BookieShell implements Tool { * Update bookie into ledger command. */ class UpdateBookieInLedgerCmd extends MyCommand { - private final Options opts = new Options(); UpdateBookieInLedgerCmd() { super(CMD_UPDATE_BOOKIE_IN_LEDGER); @@ -1749,12 +1733,11 @@ public class BookieShell implements Tool { * Command to delete a given ledger. */ class DeleteLedgerCmd extends MyCommand { - Options lOpts = new Options(); DeleteLedgerCmd() { super(CMD_DELETELEDGER); - lOpts.addOption("l", "ledgerid", true, "Ledger ID"); - lOpts.addOption("f", "force", false, "Whether to force delete the Ledger without prompt..?"); + opts.addOption("l", "ledgerid", true, "Ledger ID"); + opts.addOption("f", "force", false, "Whether to force delete the Ledger without prompt..?"); } @Override @@ -1782,7 +1765,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } } @@ -1791,7 +1774,6 @@ public class BookieShell implements Tool { * the bookies in the cluster. */ class BookieInfoCmd extends MyCommand { - Options lOpts = new Options(); BookieInfoCmd() { super(CMD_BOOKIEINFO); @@ -1809,7 +1791,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } @Override @@ -1824,7 +1806,6 @@ public class BookieShell implements Tool { * Command to trigger AuditTask by resetting lostBookieRecoveryDelay to its current value. */ class TriggerAuditCmd extends MyCommand { - Options opts = new Options(); TriggerAuditCmd() { super(CMD_TRIGGERAUDIT); @@ -1854,7 +1835,6 @@ public class BookieShell implements Tool { } class ForceAuditorChecksCmd extends MyCommand { - Options opts = new Options(); ForceAuditorChecksCmd() { super(CMD_FORCEAUDITCHECKS); @@ -1930,11 +1910,10 @@ public class BookieShell implements Tool { * server. */ class DecommissionBookieCmd extends MyCommand { - Options lOpts = new Options(); DecommissionBookieCmd() { super(CMD_DECOMMISSIONBOOKIE); - lOpts.addOption("bookieid", true, "decommission a remote bookie"); + opts.addOption("bookieid", true, "decommission a remote bookie"); } @Override @@ -1950,7 +1929,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } @Override @@ -1968,11 +1947,10 @@ public class BookieShell implements Tool { * Command to retrieve remote bookie endpoint information. */ class EndpointInfoCmd extends MyCommand { - Options lOpts = new Options(); EndpointInfoCmd() { super(CMD_ENDPOINTINFO); - lOpts.addOption("b", "bookieid", true, "Bookie Id"); + opts.addOption("b", "bookieid", true, "Bookie Id"); } @Override @@ -1987,7 +1965,7 @@ public class BookieShell implements Tool { @Override Options getOptions() { - return lOpts; + return opts; } @Override @@ -2018,7 +1996,6 @@ public class BookieShell implements Tool { * Convert bookie indexes from InterleavedStorage to DbLedgerStorage format. */ class ConvertToDbStorageCmd extends MyCommand { - Options opts = new Options(); public ConvertToDbStorageCmd() { super(CMD_CONVERT_TO_DB_STORAGE); @@ -2053,7 +2030,6 @@ public class BookieShell implements Tool { * Convert bookie indexes from DbLedgerStorage to InterleavedStorage format. */ class ConvertToInterleavedStorageCmd extends MyCommand { - Options opts = new Options(); public ConvertToInterleavedStorageCmd() { super(CMD_CONVERT_TO_INTERLEAVED_STORAGE); @@ -2087,7 +2063,6 @@ public class BookieShell implements Tool { * Rebuild DbLedgerStorage locations index. */ class RebuildDbLedgerLocationsIndexCmd extends MyCommand { - Options opts = new Options(); public RebuildDbLedgerLocationsIndexCmd() { super(CMD_REBUILD_DB_LEDGER_LOCATIONS_INDEX); @@ -2120,15 +2095,14 @@ public class BookieShell implements Tool { * Rebuild DbLedgerStorage ledgers index. */ class RebuildDbLedgersIndexCmd extends MyCommand { - Options opts = new Options(); public RebuildDbLedgersIndexCmd() { super(CMD_REBUILD_DB_LEDGERS_INDEX); + opts.addOption("v", "verbose", false, "Verbose logging, print the ledgers added to the new index"); } @Override Options getOptions() { - opts.addOption("v", "verbose", false, "Verbose logging, print the ledgers added to the new index"); return opts; } @@ -2161,15 +2135,14 @@ public class BookieShell implements Tool { * Rebuild DbLedgerStorage ledgers index. */ class CheckDbLedgersIndexCmd extends MyCommand { - Options opts = new Options(); public CheckDbLedgersIndexCmd() { super(CMD_CHECK_DB_LEDGERS_INDEX); + opts.addOption("v", "verbose", false, "Verbose logging, print the ledger data in the index."); } @Override Options getOptions() { - opts.addOption("v", "verbose", false, "Verbose logging, print the ledger data in the index."); return opts; } @@ -2201,7 +2174,6 @@ public class BookieShell implements Tool { * Regenerate an index file for interleaved storage. */ class RegenerateInterleavedStorageIndexFile extends MyCommand { - Options opts = new Options(); public RegenerateInterleavedStorageIndexFile() { super(CMD_REGENERATE_INTERLEAVED_STORAGE_INDEX_FILE); @@ -2550,4 +2522,5 @@ public class BookieShell implements Tool { private static boolean getOptionalValue(String optValue, String optName) { return StringUtils.equals(optValue, optName); } + }