diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BacklogQuotaManager.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BacklogQuotaManager.java index da0d7ccd4aec3..686e2244b560a 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BacklogQuotaManager.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BacklogQuotaManager.java @@ -94,6 +94,17 @@ public BacklogQuotaImpl getBacklogQuota(NamespaceName namespace, BacklogQuotaTyp */ public void handleExceededBacklogQuota(PersistentTopic persistentTopic, BacklogQuotaType backlogQuotaType, boolean preciseTimeBasedBacklogQuotaCheck) { + if (persistentTopic.isFenced() || persistentTopic.isClosingOrDeleting()) { + // Skip eviction work on a topic that is being torn down or transiently fenced. + // Mutating cursors here (skipEntries / markDeletePosition) contends with the + // delete path and can keep namespace force-delete from completing in time; + // the entries are about to be discarded anyway. + log.debug() + .attr("topic", persistentTopic.getName()) + .attr("backlogQuotaType", backlogQuotaType) + .log("Skipping backlog-quota eviction on fenced/closing topic"); + return; + } BacklogQuota quota = persistentTopic.getBacklogQuota(backlogQuotaType); BacklogQuotaMetrics topicBacklogQuotaMetrics = persistentTopic.getPersistentTopicMetrics().getBacklogQuotaMetrics();