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