diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java index f9a0ff2620814..7426059e576f6 100644 --- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java +++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java @@ -1152,16 +1152,17 @@ public ManagedCursor newNonDurableCursor(Position startCursorPosition, String cu return cachedCursor; } - NonDurableCursorImpl cursor = new NonDurableCursorImpl(bookKeeper, this, cursorName, - startCursorPosition, initialPosition, isReadCompacted); - cursor.setActive(); - - log.info("[{}] Opened new cursor: {}", name, cursor); + // The backlog of a non-durable cursor could be incorrect if the cursor is created before `internalTrimLedgers` + // and added to the managed ledger after `internalTrimLedgers`. + // For more details, see https://github.com/apache/pulsar/pull/23951. synchronized (this) { + NonDurableCursorImpl cursor = new NonDurableCursorImpl(bookKeeper, this, cursorName, + startCursorPosition, initialPosition, isReadCompacted); + cursor.setActive(); + log.info("[{}] Opened new cursor: {}", name, cursor); addCursor(cursor); + return cursor; } - - return cursor; } @Override