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

ayegorov 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 083e2e94d1 Fix read empty ledger exception using bookkeeper admin
083e2e94d1 is described below

commit 083e2e94d18edcd85a1d25deaf77ecad0e3de61d
Author: Hang Chen <[email protected]>
AuthorDate: Tue Apr 26 06:28:04 2022 +0800

    Fix read empty ledger exception using bookkeeper admin
    
    ### Motivation
    Fix #3222
    
    The root cause is that BookKeeperAdmin use `asyncReadEntriesInternal` to 
read entries. However, the `asyncReadEntriesInternal` doesn't check the 
lastAddConfirm, which will lead to the exception list in issue 3222
    
    ### Changes
    
    Add lastAddConfirm check before call `asyncReadEntriesInternal`
    
    Reviewers: Yong Zhang <[email protected]>, Andrey Yegorov <None>
    
    This closes #3240 from 
hangc0276/chenhang/fix_BKBookieHandleNotAvailableException_for_empty_ledger
---
 .../org/apache/bookkeeper/client/BookKeeperAdmin.java   |  5 ++---
 .../apache/bookkeeper/client/BookKeeperAdminTest.java   | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
index 1df80b1fd4..cb3057a503 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/BookKeeperAdmin.java
@@ -432,12 +432,11 @@ public class BookKeeperAdmin implements AutoCloseable {
             if (currentEntry != null) {
                 return true;
             }
-            if (lastEntryId == -1 || nextEntryId <= lastEntryId) {
+            if ((lastEntryId == -1 || nextEntryId <= lastEntryId) && 
nextEntryId <= handle.getLastAddConfirmed()) {
                 try {
                     CompletableFuture<Enumeration<LedgerEntry>> result = new 
CompletableFuture<>();
-
                     handle.asyncReadEntriesInternal(nextEntryId, nextEntryId,
-                                                    new 
SyncReadCallback(result), null, false);
+                        new SyncReadCallback(result), null, false);
 
                     currentEntry = 
SyncCallbackUtils.waitForResult(result).nextElement();
 
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperAdminTest.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperAdminTest.java
index 591761b114..4fdc05c1e2 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperAdminTest.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/BookKeeperAdminTest.java
@@ -490,6 +490,23 @@ public class BookKeeperAdminTest extends 
BookKeeperClusterTestCase {
         bkc.close();
     }
 
+    @Test
+    public void testGetEntriesFromEmptyLedger() throws Exception {
+        ClientConfiguration conf = new ClientConfiguration();
+        conf.setMetadataServiceUri(zkUtil.getMetadataServiceUri());
+        BookKeeper bkc = new BookKeeper(conf);
+        LedgerHandle lh = bkc.createLedger(numOfBookies, numOfBookies, 
digestType, "testPasswd".getBytes(UTF_8));
+        lh.close();
+        long ledgerId = lh.getId();
+
+        try (BookKeeperAdmin bkAdmin = new 
BookKeeperAdmin(zkUtil.getZooKeeperConnectString())) {
+            Iterator<LedgerEntry> iter = bkAdmin.readEntries(ledgerId, 0, 
0).iterator();
+            assertFalse(iter.hasNext());
+        }
+
+        bkc.close();
+    }
+
     @Test
     public void testGetListOfEntriesOfLedgerWithJustOneBookieInWriteQuorum() 
throws Exception {
         ClientConfiguration conf = new ClientConfiguration();

Reply via email to