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

Reply via email to