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

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


The following commit(s) were added to refs/heads/branch-4.17 by this push:
     new 8eee769fe8 [improve] Update readledger command to read all the entries 
from a bookie when first entry and last entry ids are not provided (#4692)
8eee769fe8 is described below

commit 8eee769fe8b360cb53342df17b85f28441bf6f51
Author: vraulji567 <[email protected]>
AuthorDate: Tue May 26 19:21:53 2026 -0400

    [improve] Update readledger command to read all the entries from a bookie 
when first entry and last entry ids are not provided (#4692)
    
    * Update readledger command to read all the entries from a bookie when 
first and last entry ids are not provided
    
    * Fix Test in ReadLedgerCommandTest
---
 .../tools/cli/commands/bookie/ReadLedgerCommand.java    |  8 +++++++-
 .../cli/commands/bookie/ReadLedgerCommandTest.java      | 17 ++++++++++++++++-
 2 files changed, 23 insertions(+), 2 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 20b4232e31..0e034b08ac 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
@@ -189,7 +189,13 @@ public class ReadLedgerCommand extends 
BookieCommand<ReadLedgerCommand.ReadLedge
                                                                  executor, 
scheduler, NullStatsLogger.INSTANCE,
                                                                  
bk.getBookieAddressResolver());
 
-                LongStream.range(flags.firstEntryId, 
lastEntry).forEach(entryId -> {
+                // Determine the last ledger entry from ledger metadata if its 
is not provided
+                if (flags.lastEntryId == -1 && !flags.forceRecovery) {
+                    LedgerHandle lh = bk.openLedgerNoRecovery(flags.ledgerId);
+                    lastEntry = lh.getLastAddConfirmed();
+                }
+
+                LongStream.rangeClosed(flags.firstEntryId, 
lastEntry).forEach(entryId -> {
                     CompletableFuture<Void> future = new CompletableFuture<>();
 
                     bookieClient.readEntry(bookie, flags.ledgerId, entryId,
diff --git 
a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommandTest.java
 
b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommandTest.java
index 3f80d31dba..73adf204ac 100644
--- 
a/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommandTest.java
+++ 
b/tools/ledger/src/test/java/org/apache/bookkeeper/tools/cli/commands/bookie/ReadLedgerCommandTest.java
@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -35,6 +36,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.function.Consumer;
 import lombok.SneakyThrows;
+import org.apache.bookkeeper.client.BKException;
 import org.apache.bookkeeper.client.BookKeeperAdmin;
 import org.apache.bookkeeper.client.LedgerEntry;
 import org.apache.bookkeeper.client.LedgerHandle;
@@ -42,6 +44,7 @@ import org.apache.bookkeeper.common.util.OrderedExecutor;
 import org.apache.bookkeeper.net.BookieId;
 import org.apache.bookkeeper.net.BookieSocketAddress;
 import org.apache.bookkeeper.proto.BookieClientImpl;
+import 
org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.ReadEntryCallback;
 import org.apache.bookkeeper.tools.cli.helpers.BookieCommandTestBase;
 import org.junit.Assert;
 import org.junit.Test;
@@ -89,6 +92,7 @@ public class ReadLedgerCommandTest extends 
BookieCommandTestBase {
                 when(bookKeeperAdmin.getBookieAddressResolver())
                         
.thenReturn(BookieSocketAddress.LEGACY_BOOKIEID_RESOLVER);
                 
when(bookKeeperAdmin.openLedger(anyLong())).thenReturn(ledgerHandle);
+                
when(bookKeeperAdmin.openLedgerNoRecovery(anyLong())).thenReturn(ledgerHandle);
                 when(bookKeeperAdmin.readEntries(anyLong(), anyLong(), 
anyLong())).thenReturn(entries);
             }
         });
@@ -110,7 +114,18 @@ public class ReadLedgerCommandTest extends 
BookieCommandTestBase {
                 
.newSingleThreadScheduledExecutor(any(DefaultThreadFactory.class)))
                 .thenReturn(scheduledExecutorService);
 
-        mockConstruction(BookieClientImpl.class);
+        mockConstruction(BookieClientImpl.class, (mock, contest) -> {
+            doAnswer(invocation -> {
+                ReadEntryCallback callback = invocation.getArgument(3);
+                callback.readEntryComplete(BKException.Code.OK,
+                        invocation.getArgument(1),  // ledgerId
+                        invocation.getArgument(2),  // entryId
+                        null,  // buffer
+                        invocation.getArgument(4));  // ctx
+                return null;
+            }).when(mock).readEntry(any(), anyLong(), anyLong(), any(), any(), 
anyInt());
+
+        });
 
 
     }

Reply via email to