This is an automated email from the ASF dual-hosted git repository.

chenhang pushed a commit to branch branch-4.14
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git

commit 13a9d09afecb0a6cc83f031e7ed2a7767df7716a
Author: Hang Chen <[email protected]>
AuthorDate: Thu Dec 23 17:43:28 2021 +0800

    fix readlogMetadata get logid is 0 bug (#2349)
    
    ### Motivation
    When i use `bookkeeper shell readlogmetadata`  to get an entrylog file's 
metadata info, i encountered the following exception:
    ```
    19:51:11.282 [main] INFO  org.apache.bookkeeper.bookie.EntryLogger - Failed 
to get ledgers map index from: 0.log : No file for log 0
    19:51:11.284 [main] WARN  org.apache.bookkeeper.bookie.EntryLogger - Failed 
to get channel to scan entry log: 0.log
    Exception in thread "main" 
com.google.common.util.concurrent.UncheckedExecutionException: No file for log 0
            at 
org.apache.bookkeeper.tools.cli.commands.bookie.ReadLogMetadataCommand.apply(ReadLogMetadataCommand.java:106)
            at 
org.apache.bookkeeper.bookie.BookieShell$ReadLogMetadataCmd.runCmd(BookieShell.java:988)
            at 
org.apache.bookkeeper.bookie.BookieShell$MyCommand.runCmd(BookieShell.java:223)
            at 
org.apache.bookkeeper.bookie.BookieShell.run(BookieShell.java:1976)
            at 
org.apache.bookkeeper.bookie.BookieShell.main(BookieShell.java:2067)
    Caused by: java.io.FileNotFoundException: No file for log 0
            at 
org.apache.bookkeeper.bookie.EntryLogger.findFile(EntryLogger.java:960)
            at 
org.apache.bookkeeper.bookie.EntryLogger.getChannelForLogId(EntryLogger.java:895)
            at 
org.apache.bookkeeper.bookie.EntryLogger.scanEntryLog(EntryLogger.java:976)
            at 
org.apache.bookkeeper.bookie.EntryLogger.extractEntryLogMetadataByScanning(EntryLogger.java:1132)
            at 
org.apache.bookkeeper.bookie.EntryLogger.getEntryLogMetadata(EntryLogger.java:1041)
            at 
org.apache.bookkeeper.tools.cli.commands.bookie.ReadLogMetadataCommand.printEntryLogMetadata(ReadLogMetadataCommand.java:132)
            at 
org.apache.bookkeeper.tools.cli.commands.bookie.ReadLogMetadataCommand.readLogMetadata(ReadLogMetadataCommand.java:125)
            at 
org.apache.bookkeeper.tools.cli.commands.bookie.ReadLogMetadataCommand.apply(ReadLogMetadataCommand.java:104)
    
    ```
    
    In the source code, it parse the entry log id with 10 radix, however, the 
entry log file name is 16 radix entry log id and parse failed. Then parsing it 
with entry log file name, and set the log file name into flags. When parse the 
flags in `ReadLogMetadataCommand` class, it first check
    ```
    private static final long DEFAULT_LOGID = -1L
    if (flags.logId != DEFAULT_LOGID) {
         logid = flags.logId;
    }
    ```
    the default flag.logid is 0, so the `logid` will be set to 0.
    
    ### Changes
    1. using `16 radix` to parse entry log id
    2. when using entry log file name to get entry log metatdata, set the 
flags.logid to `-1`
    3. export entry log usage to the output
    
    (cherry picked from commit 4dae979c5b35c434105f0c9810c87dd91237bb7e)
---
 .../src/main/java/org/apache/bookkeeper/bookie/BookieShell.java        | 3 ++-
 .../bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java   | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

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 c398c063ff..ee3954e3b9 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
@@ -1047,10 +1047,11 @@ public class BookieShell implements Tool {
 
             long logId;
             try {
-                logId = Long.parseLong(leftArgs[0]);
+                logId = Long.parseLong(leftArgs[0], 16);
                 flags.logId(logId);
             } catch (NumberFormatException nfe) {
                 flags.logFilename(leftArgs[0]);
+                flags.logId(-1);
             }
             cmd.apply(bkConf, flags);
             return 0;
diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java
index ea63099acc..b22338d2e8 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLogMetadataCommand.java
@@ -130,6 +130,9 @@ public class ReadLogMetadataCommand extends 
BookieCommand<ReadLogMetadataFlags>
         LOG.info("Print entryLogMetadata of entrylog {} ({}.log)", logId, 
Long.toHexString(logId));
         initEntryLogger(conf);
         EntryLogMetadata entryLogMetadata = 
entryLogger.getEntryLogMetadata(logId);
+        LOG.info("entryLogId: {}, remaining size: {}, total size: {}, usage: 
{}", entryLogMetadata.getEntryLogId(),
+                entryLogMetadata.getRemainingSize(), 
entryLogMetadata.getTotalSize(), entryLogMetadata.getUsage());
+
         entryLogMetadata.getLedgersMap().forEach((ledgerId, size) -> {
             LOG.info("--------- Lid={}, TotalSizeOfEntriesOfLedger={}  
---------",
                      ledgerIdFormatter.formatLedgerId(ledgerId), size);

Reply via email to