Fix deadlock during GC of non-persistent topic (#4003)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/NonPersistentTopic.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/NonPersistentTopic.java
index bd60d95..b0cbf1c 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/NonPersistentTopic.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/NonPersistentTopic.java
@@ -465,9 +465,13 @@
isFenced = false;
deleteFuture.completeExceptionally(ex);
} else {
- brokerService.removeTopicFromCache(topic);
- log.info("[{}] Topic deleted", topic);
- deleteFuture.complete(null);
+ // topic GC iterates over topics map and removing from the map with the same thread creates
+ // deadlock. so, execute it in different thread
+ brokerService.executor().execute(() -> {
+ brokerService.removeTopicFromCache(topic);
+ log.info("[{}] Topic deleted", topic);
+ deleteFuture.complete(null);
+ });
}
});
} else {