diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/NamespaceResources.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/NamespaceResources.java index 190d25144daeb..8f677f069d578 100644 --- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/NamespaceResources.java +++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/NamespaceResources.java @@ -54,7 +54,7 @@ public class NamespaceResources extends BaseResources { private static final String POLICIES_READONLY_FLAG_PATH = "/admin/flags/policies-readonly"; private static final String NAMESPACE_BASE_PATH = "/namespace"; - + private static final String BUNDLE_DATA_BASE_PATH = "/loadbalance/bundle-data"; public NamespaceResources(MetadataStore localStore, MetadataStore configurationStore, int operationTimeoutSec) { super(configurationStore, Policies.class, operationTimeoutSec); this.configurationStore = configurationStore; @@ -281,4 +281,39 @@ public CompletableFuture clearPartitionedTopicMetadataAsync(NamespaceName return completableFuture; } } + + + // clear resource of `/loadbalance/bundle-data/{tenant}/{namespace}/` for zk-node + public CompletableFuture deleteBundleDataAsync(NamespaceName ns) { + final String namespaceBundlePath = joinPath(BUNDLE_DATA_BASE_PATH, ns.toString()); + CompletableFuture future = new CompletableFuture(); + deleteRecursiveAsync(this, namespaceBundlePath).whenComplete((ignore, ex) -> { + if (ex instanceof MetadataStoreException.NotFoundException) { + future.complete(null); + } else if (ex != null) { + future.completeExceptionally(ex); + } else { + future.complete(null); + } + }); + + return future; + } + + // clear resource of `/loadbalance/bundle-data/{tenant}/` for zk-node + public CompletableFuture deleteBundleDataTenantAsync(String tenant) { + final String tenantBundlePath = joinPath(BUNDLE_DATA_BASE_PATH, tenant); + CompletableFuture future = new CompletableFuture(); + deleteRecursiveAsync(this, tenantBundlePath).whenComplete((ignore, ex) -> { + if (ex instanceof MetadataStoreException.NotFoundException) { + future.complete(null); + } else if (ex != null) { + future.completeExceptionally(ex); + } else { + future.complete(null); + } + }); + + return future; + } } \ No newline at end of file diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java index df8fd1c4e610b..23d748de2cfb9 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java @@ -323,7 +323,9 @@ protected CompletableFuture internalClearZkSources() { // z-node can be deleted now .thenCompose(ignore -> namespaceResources().deletePoliciesAsync(namespaceName)) // clear z-node of local policies - .thenCompose(ignore -> getLocalPolicies().deleteLocalPoliciesAsync(namespaceName)); + .thenCompose(ignore -> getLocalPolicies().deleteLocalPoliciesAsync(namespaceName)) + // clear /loadbalance/bundle-data + .thenCompose(ignore -> namespaceResources().deleteBundleDataAsync(namespaceName)); } diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java index 209a532970191..3ec725e6f8041 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/TenantsBase.java @@ -265,6 +265,8 @@ protected void internalDeleteTenant(AsyncResponse asyncResponse, String tenant) .clearTenantPersistence(tenant)) .thenCompose(ignore -> pulsar().getPulsarResources().getNamespaceResources() .deleteTenantAsync(tenant)) + .thenCompose(ignore -> pulsar().getPulsarResources().getNamespaceResources() + .deleteBundleDataTenantAsync(tenant)) .whenComplete((ignore, ex) -> { if (ex != null) { log.error("[{}] Failed to delete tenant {}", clientAppId(), tenant, ex); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java index 0bf34a16fe020..baafbc1ba4253 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java @@ -1311,7 +1311,9 @@ public void testDeleteTenant() throws Exception { assertFalse(admin.tenants().getTenants().contains(tenant)); final String managedLedgersPath = "/managed-ledgers/" + tenant; + final String bundleDataPath = "/loadbalance/bundle-data/" + tenant; assertFalse(pulsar.getLocalMetadataStore().exists(managedLedgersPath).join()); + assertFalse(pulsar.getLocalMetadataStore().exists(bundleDataPath).join()); } @Test @@ -1355,6 +1357,9 @@ public void testDeleteNamespace() throws Exception { final String managedLedgersPath = "/managed-ledgers/" + namespace; assertFalse(pulsar.getLocalMetadataStore().exists(managedLedgersPath).join()); + + final String bundleDataPath = "/loadbalance/bundle-data/" + namespace; + assertFalse(pulsar.getLocalMetadataStore().exists(bundleDataPath).join()); } @Test