This is an automated email from the ASF dual-hosted git repository. yong pushed a commit to branch branch-4.15 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 6331f8f9ae71d40b060aaa0fed87b0f2890b5533 Author: atomchen <[email protected]> AuthorDate: Wed Sep 20 17:55:12 2023 +0800 Fix NoSuchElementException when rereplicate empty ledgers (#4039) ### Motivation Master issue: #4036 ### Changes Set the `numberOfEntriesToReplicate` to 0 when ledger is empty (cherry picked from commit 95320f41cacd148dbfa83a64960d1a05e43aa292) --- .../apache/bookkeeper/client/LedgerFragmentReplicator.java | 2 +- .../bookkeeper/client/TestLedgerFragmentReplication.java | 14 +++----------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java index d39e32f7ec..872a501578 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragmentReplicator.java @@ -285,7 +285,7 @@ public class LedgerFragmentReplicator { assert false; } - long numberOfEntriesToReplicate = (lastEntryId - firstEntryId) + 1; + long numberOfEntriesToReplicate = firstEntryId == INVALID_ENTRY_ID ? 0 : (lastEntryId - firstEntryId) + 1; long splitsWithFullEntries = numberOfEntriesToReplicate / rereplicationEntryBatchSize; diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerFragmentReplication.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerFragmentReplication.java index 90e4fd1b7a..030cd8b038 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerFragmentReplication.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerFragmentReplication.java @@ -265,6 +265,8 @@ public class TestLedgerFragmentReplication extends BookKeeperClusterTestCase { testSplitIntoSubFragments(22, 103, 11, 8, lh); testSplitIntoSubFragments(49, 51, 1, 3, lh); testSplitIntoSubFragments(11, 101, 3, 31, lh); + testSplitIntoSubFragments(0, -1, 1, 1, lh); + testSplitIntoSubFragments(0, -1, 10, 1, lh); } /** @@ -274,17 +276,7 @@ public class TestLedgerFragmentReplication extends BookKeeperClusterTestCase { final long oriFragmentLastEntry, long entriesPerSubFragment, long expectedSubFragments, LedgerHandle lh) { LedgerFragment fr = new LedgerFragment(lh, oriFragmentFirstEntry, - oriFragmentLastEntry, Sets.newHashSet(0)) { - @Override - public long getLastStoredEntryId() { - return oriFragmentLastEntry; - } - - @Override - public long getFirstStoredEntryId() { - return oriFragmentFirstEntry; - } - }; + oriFragmentLastEntry, Sets.newHashSet(0)); Set<LedgerFragment> subFragments = LedgerFragmentReplicator .splitIntoSubFragments(lh, fr, entriesPerSubFragment); assertEquals(expectedSubFragments, subFragments.size());
