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);

Reply via email to