This is an automated email from the ASF dual-hosted git repository.

zixuan pushed a commit to branch branch-2.10
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-2.10 by this push:
     new 46d2ecde112 [fix][broker] Fix unack count when mixing non batch index 
and batch index acks (#21126)
46d2ecde112 is described below

commit 46d2ecde1127eb6a6c5cd2390d2061dbfa78c0b9
Author: erobot <[email protected]>
AuthorDate: Mon Sep 11 09:56:34 2023 +0800

    [fix][broker] Fix unack count when mixing non batch index and batch index 
acks (#21126)
    
    (cherry picked from commit 6e8bf93135b2e80c657e7d80f94a57f40e634f02)
---
 .../org/apache/pulsar/broker/service/Consumer.java |  9 ++----
 .../BatchMessageWithBatchIndexLevelTest.java       | 36 ++++++++++++++++++++++
 2 files changed, 38 insertions(+), 7 deletions(-)

diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java
index a7c06d0c85d..1e6d9690c26 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/Consumer.java
@@ -444,7 +444,6 @@ public class Consumer {
     private CompletableFuture<Long> individualAckNormal(CommandAck ack, 
Map<String, Long> properties) {
         List<Position> positionsAcked = new ArrayList<>();
         long totalAckCount = 0;
-        boolean individualAck = false;
         for (int i = 0; i < ack.getMessageIdsCount(); i++) {
             MessageIdData msgId = ack.getMessageIdAt(i);
             PositionImpl position;
@@ -465,19 +464,15 @@ public class Consumer {
                                 
.syncBatchPositionBitSetForPendingAck(position);
                     }
                 }
+                addAndGetUnAckedMsgs(ackOwnerConsumer, -(int) ackedCount);
             } else {
                 position = PositionImpl.get(msgId.getLedgerId(), 
msgId.getEntryId());
                 ackedCount = getAckedCountForMsgIdNoAckSets(batchSize, 
position, ackOwnerConsumer);
-                individualAck = true;
-            }
-
-            if (individualAck) {
                 if (checkCanRemovePendingAcksAndHandle(position, msgId)) {
                     addAndGetUnAckedMsgs(ackOwnerConsumer, -(int) ackedCount);
                 }
-            } else {
-                addAndGetUnAckedMsgs(ackOwnerConsumer, -(int) ackedCount);
             }
+
             positionsAcked.add(position);
 
             checkAckValidationError(ack, position);
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageWithBatchIndexLevelTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageWithBatchIndexLevelTest.java
index 769b611b0bd..344f8c34514 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageWithBatchIndexLevelTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageWithBatchIndexLevelTest.java
@@ -369,4 +369,40 @@ public class BatchMessageWithBatchIndexLevelTest extends 
BatchMessageTest {
         consumer.close();
         admin.topics().delete(topicName);
     }
+
+    @Test
+    public void testMixIndexAndNonIndexUnAckMessageCount() throws Exception {
+        final String topicName = 
"persistent://prop/ns-abc/testMixIndexAndNonIndexUnAckMessageCount-";
+
+        @Cleanup
+        Producer<byte[]> producer = pulsarClient.newProducer()
+                .topic(topicName)
+                .enableBatching(true)
+                .batchingMaxPublishDelay(100, TimeUnit.MILLISECONDS)
+                .create();
+        @Cleanup
+        Consumer<byte[]> consumer = pulsarClient.newConsumer()
+                .topic(topicName)
+                .subscriptionName("sub")
+                .subscriptionType(SubscriptionType.Shared)
+                .acknowledgmentGroupTime(100, TimeUnit.MILLISECONDS)
+                .enableBatchIndexAcknowledgment(true)
+                .isAckReceiptEnabled(true)
+                .subscribe();
+
+        // send two batch messages: [(1), (2,3)]
+        producer.send("1".getBytes());
+        producer.sendAsync("2".getBytes());
+        producer.send("3".getBytes());
+
+        Message<byte[]> message1 = consumer.receive();
+        Message<byte[]> message2 = consumer.receive();
+        Message<byte[]> message3 = consumer.receive();
+        consumer.acknowledgeAsync(message1);
+        consumer.acknowledge(message2);  // send group ack: non-index ack for 
1, index ack for 2
+        consumer.acknowledge(message3);  // index ack for 3
+
+        assertEquals(admin.topics().getStats(topicName).getSubscriptions()
+                .get("sub").getUnackedMessages(), 0);
+    }
 }

Reply via email to