This is an automated email from the ASF dual-hosted git repository. yong pushed a commit to branch branch-4.15 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 84ecb39301fc89a7635adae9e684a9af7cd6d809 Author: Yuri Mizushima <[email protected]> AuthorDate: Fri Nov 25 20:28:08 2022 +0900 Exit bookkeeper shell correctly even if fails to run for some reason (#3663) * fix: close legacyLM and longLM if call HierarchicalLedgerManager#close * fix: exit as ok when calling listledgers command and get NoSuchLedgerExistsOnMetadataServerException * fix: call exit even if get some exception in bookkeeler shell (cherry picked from commit dd8ba477ee1f7b376869777ecf37463e8d2edec5) --- .../org/apache/bookkeeper/bookie/BookieShell.java | 78 ++++++++++++---------- .../bookkeeper/meta/HierarchicalLedgerManager.java | 11 +++ .../cli/commands/bookie/ListLedgersCommand.java | 4 +- 3 files changed, 56 insertions(+), 37 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 0eeb0dc601..731a5dd5dc 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 @@ -2395,46 +2395,52 @@ public class BookieShell implements Tool { } } - public static void main(String[] argv) throws Exception { - BookieShell shell = new BookieShell(); - - // handle some common options for multiple cmds - Options opts = new Options(); - opts.addOption(CONF_OPT, true, "configuration file"); - opts.addOption(LEDGERID_FORMATTER_OPT, true, "format of ledgerId"); - opts.addOption(ENTRY_FORMATTER_OPT, true, "format of entries"); - BasicParser parser = new BasicParser(); - CommandLine cmdLine = parser.parse(opts, argv, true); - - // load configuration - CompositeConfiguration conf = new CompositeConfiguration(); - if (cmdLine.hasOption(CONF_OPT)) { - String val = cmdLine.getOptionValue(CONF_OPT); - conf.addConfiguration(new PropertiesConfiguration( + public static void main(String[] argv) { + int res = -1; + try { + BookieShell shell = new BookieShell(); + + // handle some common options for multiple cmds + Options opts = new Options(); + opts.addOption(CONF_OPT, true, "configuration file"); + opts.addOption(LEDGERID_FORMATTER_OPT, true, "format of ledgerId"); + opts.addOption(ENTRY_FORMATTER_OPT, true, "format of entries"); + BasicParser parser = new BasicParser(); + CommandLine cmdLine = parser.parse(opts, argv, true); + + // load configuration + CompositeConfiguration conf = new CompositeConfiguration(); + if (cmdLine.hasOption(CONF_OPT)) { + String val = cmdLine.getOptionValue(CONF_OPT); + conf.addConfiguration(new PropertiesConfiguration( new File(val).toURI().toURL())); - } - shell.setConf(conf); + } + shell.setConf(conf); - // ledgerid format - if (cmdLine.hasOption(LEDGERID_FORMATTER_OPT)) { - String val = cmdLine.getOptionValue(LEDGERID_FORMATTER_OPT); - shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(val, shell.bkConf); - } else { - shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(shell.bkConf); - } - LOG.debug("Using ledgerIdFormatter {}", shell.ledgerIdFormatter.getClass()); + // ledgerid format + if (cmdLine.hasOption(LEDGERID_FORMATTER_OPT)) { + String val = cmdLine.getOptionValue(LEDGERID_FORMATTER_OPT); + shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(val, shell.bkConf); + } else { + shell.ledgerIdFormatter = LedgerIdFormatter.newLedgerIdFormatter(shell.bkConf); + } + LOG.debug("Using ledgerIdFormatter {}", shell.ledgerIdFormatter.getClass()); - // entry format - if (cmdLine.hasOption(ENTRY_FORMATTER_OPT)) { - String val = cmdLine.getOptionValue(ENTRY_FORMATTER_OPT); - shell.entryFormatter = EntryFormatter.newEntryFormatter(val, shell.bkConf); - } else { - shell.entryFormatter = EntryFormatter.newEntryFormatter(shell.bkConf); - } - LOG.debug("Using entry formatter {}", shell.entryFormatter.getClass()); + // entry format + if (cmdLine.hasOption(ENTRY_FORMATTER_OPT)) { + String val = cmdLine.getOptionValue(ENTRY_FORMATTER_OPT); + shell.entryFormatter = EntryFormatter.newEntryFormatter(val, shell.bkConf); + } else { + shell.entryFormatter = EntryFormatter.newEntryFormatter(shell.bkConf); + } + LOG.debug("Using entry formatter {}", shell.entryFormatter.getClass()); - int res = shell.run(cmdLine.getArgs()); - System.exit(res); + res = shell.run(cmdLine.getArgs()); + } catch (Throwable e) { + LOG.error("Got an exception", e); + } finally { + System.exit(res); + } } private synchronized void initEntryLogger() throws IOException { diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java index b5fd0f21ae..81ef9e7dff 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/HierarchicalLedgerManager.java @@ -123,4 +123,15 @@ class HierarchicalLedgerManager extends AbstractHierarchicalLedgerManager { protected String getLedgerParentNodeRegex() { return StringUtils.HIERARCHICAL_LEDGER_PARENT_NODE_REGEX; } + + @Override + public void close() { + super.close(); + if (legacyLM != null) { + legacyLM.close(); + } + if (longLM != null) { + longLM.close(); + } + } } diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java index c743222844..462c5abcbe 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ListLedgersCommand.java @@ -157,7 +157,9 @@ public class ListLedgersCommand extends BookieCommand<ListLedgersFlags> { } cb.processResult(BKException.Code.OK, null, null); } else if (BKException.getExceptionCode(exception) - == BKException.Code.NoSuchLedgerExistsException) { + == BKException.Code.NoSuchLedgerExistsException + || BKException.getExceptionCode(exception) + == BKException.Code.NoSuchLedgerExistsOnMetadataServerException) { cb.processResult(BKException.Code.OK, null, null); } else { LOG.error("Unable to read the ledger: {} information", ledgerId);
