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 2024/01/18 13:21:17 UTC
(bookkeeper) 03/23: 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 branch-4.16
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit ec7fb13815d19148af65dd0c459e71bd8d77c4ae
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
(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 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());