diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/InMemoryDelayedDeliveryTracker.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/InMemoryDelayedDeliveryTracker.java index a48ed4161386d..900896cdf47d2 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/InMemoryDelayedDeliveryTracker.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/InMemoryDelayedDeliveryTracker.java @@ -30,6 +30,7 @@ import java.util.NavigableSet; import java.util.TreeSet; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicLong; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.bookkeeper.mledger.Position; @@ -64,6 +65,9 @@ public class InMemoryDelayedDeliveryTracker extends AbstractDelayedDeliveryTrack // The bit count to trim to reduce memory occupation. private final int timestampPrecisionBitCnt; + // Count of delayed messages in the tracker. + private final AtomicLong delayedMessagesCount = new AtomicLong(0); + InMemoryDelayedDeliveryTracker(AbstractPersistentDispatcherMultipleConsumers dispatcher, Timer timer, long tickTimeMillis, boolean isDelayedDeliveryDeliverAtTimeStrict, @@ -125,6 +129,8 @@ public boolean addMessage(long ledgerId, long entryId, long deliverAt) { delayedMessageMap.computeIfAbsent(timestamp, k -> new Long2ObjectRBTreeMap<>()) .computeIfAbsent(ledgerId, k -> new Roaring64Bitmap()) .add(entryId); + delayedMessagesCount.incrementAndGet(); + updateTimer(); checkAndUpdateHighest(deliverAt); @@ -183,6 +189,7 @@ public NavigableSet getScheduledMessages(int maxMessages) { positions.add(PositionFactory.create(ledgerId, entryId)); }); n -= cardinality; + delayedMessagesCount.addAndGet(-cardinality); ledgerIdToDelete.add(ledgerId); } else { long[] entryIdsArray = entryIds.toArray(); @@ -190,6 +197,7 @@ public NavigableSet getScheduledMessages(int maxMessages) { positions.add(PositionFactory.create(ledgerId, entryIdsArray[i])); entryIds.removeLong(entryIdsArray[i]); } + delayedMessagesCount.addAndGet(-n); n = 0; } if (n <= 0) { @@ -221,14 +229,13 @@ public NavigableSet getScheduledMessages(int maxMessages) { @Override public CompletableFuture clear() { this.delayedMessageMap.clear(); + this.delayedMessagesCount.set(0); return CompletableFuture.completedFuture(null); } @Override public long getNumberOfDelayedMessages() { - return delayedMessageMap.values().stream().mapToLong( - ledgerMap -> ledgerMap.values().stream().mapToLong( - Roaring64Bitmap::getLongCardinality).sum()).sum(); + return delayedMessagesCount.get(); } /**