This is an automated email from the ASF dual-hosted git repository. lhotari pushed a commit to branch branch-3.3 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 24848ebd75ff214454497d010231a37df01ce9ba Author: fengyubiao <[email protected]> AuthorDate: Fri Jun 13 13:52:56 2025 +0800 [fix][ml] Cursor ignores the position that has an empty ack-set if disabled deletionAtBatchIndexLevelEnabled (#24406) (cherry picked from commit 3bd70fd74fd2586724d4830c140a42517e028959) --- .../apache/bookkeeper/mledger/impl/ManagedCursorImpl.java | 2 +- .../apache/bookkeeper/mledger/impl/ManagedCursorTest.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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 fe10ed6e2fe..fc70ce4c204 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 @@ -2383,7 +2383,7 @@ public class ManagedCursorImpl implements ManagedCursor { } continue; } - if (position.ackSet == null) { + if (position.ackSet == null || position.ackSet.length == 0) { if (batchDeletedIndexes != null) { batchDeletedIndexes.remove(position); } diff --git a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java index 47497a37617..d223164a07c 100644 --- a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java +++ b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedCursorTest.java @@ -5218,5 +5218,20 @@ public class ManagedCursorTest extends MockedBookKeeperTestCase { assertEquals(positionRef4.get(), position4); } + @Test + public void testDeleteBatchedMessageWithEmptyAckSet() throws Exception { + ManagedLedgerConfig managedLedgerConfig = new ManagedLedgerConfig(); + managedLedgerConfig.setDeletionAtBatchIndexLevelEnabled(false); + ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open("testDeleteBatchedMessageWithEmptyAckSet", + managedLedgerConfig); + ManagedCursorImpl cursor = (ManagedCursorImpl) ml.openCursor("c1"); + Position position = ml.addEntry(new byte[1]); + Position positionWithEmptyAckSet = + new PositionImpl(position.getLedgerId(), position.getEntryId(), new long[]{}); + cursor.delete(positionWithEmptyAckSet); + assertEquals(cursor.markDeletePosition, position); + ml.delete(); + } + private static final Logger log = LoggerFactory.getLogger(ManagedCursorTest.class); }
