From a87ca15939161ddff5bf257f66e74188fa3eb528 Mon Sep 17 00:00:00 2001 From: water <672684719@qq.com> Date: Tue, 11 Aug 2026 00:41:48 +0800 Subject: [PATCH] fix: run alignAcknowledgeStatus for every flushed entry, not just the last one (#26304) --- .../bookkeeper/mledger/impl/ManagedCursorImpl.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java index 6a07c69164ece..44bb94b60c075 100644 --- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java +++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java @@ -2462,10 +2462,20 @@ public void operationComplete() { mdEntry.newPosition, null); // Remove from the individual deleted messages all the entries before the new mark delete - // point. + // point. When several mark-delete requests where flushed together (callbackGroup), apply + // the in-memory state mutation of EVERY request in the group, not just the last one. + // Otherwise a cursor reset that was queued before a later ack would have its + // alignAcknowledgeStatusAfterPersisted silently dropped while the reset still reports + // success, leaving the cursor un-moved (see issue #26304). lock.writeLock().lock(); try { - mdEntry.alignAcknowledgeStatus(); + if (mdEntry.callbackGroup != null) { + for (MarkDeleteEntry e : mdEntry.callbackGroup) { + e.alignAcknowledgeStatus(); + } + } else { + mdEntry.alignAcknowledgeStatus(); + } } finally { lock.writeLock().unlock(); }