From 189a48998a260bd35b6afb859652e6935d74d182 Mon Sep 17 00:00:00 2001 From: liubingxing Date: Thu, 22 Feb 2024 14:11:50 +0800 Subject: [PATCH] ReadLedgerCommand can't get lastEntry when specifying the ledger range and bookie addr --- .../commands/bookie/ReadLedgerCommand.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java index 20b4232e314..b805aa2537a 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommand.java @@ -188,35 +188,36 @@ private boolean readledger(ServerConfiguration serverConf, ReadLedgerFlags flags BookieClient bookieClient = new BookieClientImpl(conf, eventLoopGroup, UnpooledByteBufAllocator.DEFAULT, executor, scheduler, NullStatsLogger.INSTANCE, bk.getBookieAddressResolver()); - - LongStream.range(flags.firstEntryId, lastEntry).forEach(entryId -> { - CompletableFuture future = new CompletableFuture<>(); - - bookieClient.readEntry(bookie, flags.ledgerId, entryId, - (rc, ledgerId1, entryId1, buffer, ctx) -> { - if (rc != BKException.Code.OK) { - LOG.error("Failed to read entry {} -- {}", entryId1, - BKException.getMessage(rc)); - future.completeExceptionally(BKException.create(rc)); - return; - } - - LOG.info("--------- Lid={}, Eid={} ---------", - ledgerIdFormatter.formatLedgerId(flags.ledgerId), entryId); - if (flags.msg) { - LOG.info("Data: " + ByteBufUtil.prettyHexDump(buffer)); - } - - future.complete(null); - }, null, BookieProtocol.FLAG_NONE); - - try { - future.get(); - } catch (Exception e) { - LOG.error("Error future.get while reading entries from ledger {}", flags.ledgerId, e); - } - }); - + // if firstEntryId == lastEntryId == -1, it will cause an infinite loop + if (lastEntry >= 0) { + LongStream.rangeClosed(flags.firstEntryId, lastEntry).forEach(entryId -> { + CompletableFuture future = new CompletableFuture<>(); + + bookieClient.readEntry(bookie, flags.ledgerId, entryId, + (rc, ledgerId1, entryId1, buffer, ctx) -> { + if (rc != BKException.Code.OK) { + LOG.error("Failed to read entry {} -- {}", entryId1, + BKException.getMessage(rc)); + future.completeExceptionally(BKException.create(rc)); + return; + } + + LOG.info("--------- Lid={}, Eid={} ---------", + ledgerIdFormatter.formatLedgerId(flags.ledgerId), entryId); + if (flags.msg) { + LOG.info("Data: " + ByteBufUtil.prettyHexDump(buffer)); + } + + future.complete(null); + }, null, BookieProtocol.FLAG_NONE); + + try { + future.get(); + } catch (Exception e) { + LOG.error("Error future.get while reading entries from ledger {}", flags.ledgerId, e); + } + }); + } eventLoopGroup.shutdownGracefully(); executor.shutdown(); bookieClient.close();