diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java index 3b8d7e4ff7820..ea587566da128 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/ClustersBase.java @@ -902,16 +902,18 @@ private CompletableFuture filterAndUnloadMatchedNamespaceAsync(String clus List> futures = clusterLocalNamespaces.stream() .map(namespaceName -> adminClient.namespaces().unloadAsync(namespaceName)) .collect(Collectors.toList()); - return FutureUtil.waitForAll(futures).thenAccept(__ -> { + return FutureUtil.waitForAll(futures).thenAcceptAsync(__ -> { try { - // write load info to load manager to make the load happens fast + // Write the load report so the unloaded namespaces rebalance quickly. Run it on the + // broker executor rather than the admin-client callback thread that completes the + // unload futures, because writeLoadReportOnZookeeper blocks on a metadata-store write. pulsar().getLoadManager().get().writeLoadReportOnZookeeper(true); } catch (Exception e) { log.warn() .exception(e) .log("Failed to writeLoadReportOnZookeeper."); } - }); + }, pulsar().getExecutor()); }); }