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);
 }

Reply via email to