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 aacd7a21f5a..2e1dc179722 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 @@ -567,6 +567,7 @@ class ReadLedgerEntriesCmd extends MyCommand { 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, "Ensure the ledger is properly closed before reading"); } @Override @@ -582,7 +583,8 @@ String getDescription() { @Override String getUsage() { return "readledger [-msg] -ledgerid " - + "[-firstentryid [-lastentryid ]]"; + + "[-firstentryid [-lastentryid ]] " + + "[-force-recovery]"; } @Override @@ -594,9 +596,10 @@ int runCmd(CommandLine cmdLine) throws Exception { } final long firstEntry = getOptionLongValue(cmdLine, "firstentryid", 0); - final long lastEntry = getOptionLongValue(cmdLine, "lastentryid", -1); + long lastEntry = getOptionLongValue(cmdLine, "lastentryid", -1); boolean printMsg = cmdLine.hasOption("m"); + boolean forceRecovery = cmdLine.hasOption("r"); ClientConfiguration conf = new ClientConfiguration(); conf.addConfiguration(bkConf); @@ -604,13 +607,22 @@ int runCmd(CommandLine cmdLine) throws Exception { BookKeeperAdmin bk = null; try { bk = new BookKeeperAdmin(conf); + if (forceRecovery) { + // Force the opening of the ledger to trigger recovery + try (LedgerHandle lh = bk.openLedger(ledgerId)) { + if (lastEntry == -1 || lastEntry > lh.getLastAddConfirmed()) { + lastEntry = lh.getLastAddConfirmed(); + } + } + } + Iterator entries = bk.readEntries(ledgerId, firstEntry, lastEntry).iterator(); while (entries.hasNext()) { LedgerEntry entry = entries.next(); formatEntry(entry, printMsg); } } catch (Exception e) { - LOG.error("Error reading entries from ledger {}", ledgerId, e.getCause()); + LOG.error("Error reading entries from ledger {}", ledgerId, e); return -1; } finally { if (bk != null) {