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

yong 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 4dae979  fix readlogMetadata get logid is 0 bug (#2349)
4dae979 is described below

commit 4dae979c5b35c434105f0c9810c87dd91237bb7e
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
---
 .../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 8043d26..c332eca 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
@@ -1052,10 +1052,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 ea63099..b22338d 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