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