You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by ch...@apache.org on 2023/09/20 09:55:18 UTC

[bookkeeper] branch master updated: Fix NoSuchElementException when rereplicate empty ledgers (#4039)

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

chenhang 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 95320f41ca Fix NoSuchElementException when rereplicate empty ledgers (#4039)
95320f41ca is described below

commit 95320f41cacd148dbfa83a64960d1a05e43aa292
Author: atomchen <49...@qq.com>
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
---
 .../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 6b439b0960..b9dc4c32d2 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
@@ -293,7 +293,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 a010930e06..b67caaae17 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
@@ -263,6 +263,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);
     }
 
     /**
@@ -272,17 +274,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());