This is an automated email from the ASF dual-hosted git repository.

bogong pushed a commit to branch branch-2.9
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/branch-2.9 by this push:
     new 2e04ba69ca7 Fix zk-node leak of admin path (#12972)
2e04ba69ca7 is described below

commit 2e04ba69ca7cdda86a6cd9608de7fa98c8f2d930
Author: xiaolong ran <[email protected]>
AuthorDate: Mon Nov 29 16:30:44 2021 +0800

    Fix zk-node leak of admin path (#12972)
    
    Signed-off-by: xiaolongran <[email protected]>
    
    Fixes #12968
    
    When we run follow command:
    
    ```
    bin/pulsar-admin tenants delete test2
    ```
    
    the zk-node of `/admin/partitioned-topics` and `/admin/local-policies` wil 
not remove, casued by zk-node leak.
    
    - clear tenant zk-node of `/admin/partitioned-topics/`
    - clear tenant zk-node of `/admin/local-policies/`
    - add test case
    
    (cherry picked from commit 86fe7d2c367deb4f9a4d98ab08f9372ba5f5ac5f)
---
 .../pulsar/broker/resources/LocalPoliciesResources.java  | 16 ++++++++++++++++
 .../pulsar/broker/resources/NamespaceResources.java      | 15 +++++++++++++++
 .../org/apache/pulsar/broker/admin/impl/TenantsBase.java |  4 ++++
 .../org/apache/pulsar/broker/admin/AdminApi2Test.java    |  4 ++++
 4 files changed, 39 insertions(+)

diff --git 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/LocalPoliciesResources.java
 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/LocalPoliciesResources.java
index 29a6a4666e2..032991fceac 100644
--- 
a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/LocalPoliciesResources.java
+++ 
b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/resources/LocalPoliciesResources.java
@@ -30,6 +30,7 @@ import org.apache.pulsar.metadata.api.CacheGetResult;
 import org.apache.pulsar.metadata.api.GetResult;
 import org.apache.pulsar.metadata.api.MetadataStore;
 import org.apache.pulsar.metadata.api.MetadataStoreException;
+import org.apache.zookeeper.KeeperException;
 
 public class LocalPoliciesResources extends BaseResources<LocalPolicies> {
 
@@ -83,6 +84,21 @@ public class LocalPoliciesResources extends 
BaseResources<LocalPolicies> {
         return deleteAsync(joinPath(LOCAL_POLICIES_ROOT, ns.toString()));
     }
 
+    public CompletableFuture<Void> deleteLocalPoliciesTenantAsync(String 
tenant) {
+        final String localPoliciesPath = joinPath(LOCAL_POLICIES_ROOT, tenant);
+        CompletableFuture<Void> future = new CompletableFuture<Void>();
+        deleteAsync(localPoliciesPath).whenComplete((ignore, ex) -> {
+            if (ex != null && ex.getCause().getCause() instanceof 
KeeperException) {
+                future.complete(null);
+            } else if (ex != null) {
+                future.completeExceptionally(ex);
+            } else {
+                future.complete(null);
+            }
+        });
+        return future;
+    }
+
     public static boolean isLocalPoliciesPath(String path) {
         return path.startsWith(LOCAL_POLICIES_ROOT);
     }
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 8f677f069d5..dd958d07893 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
@@ -280,6 +280,21 @@ public class NamespaceResources extends 
BaseResources<Policies> {
 
             return completableFuture;
         }
+
+        public CompletableFuture<Void> clearPartitionedTopicTenantAsync(String 
tenant) {
+            final String partitionedTopicPath = 
joinPath(PARTITIONED_TOPIC_PATH, tenant);
+            CompletableFuture<Void> future = new CompletableFuture<Void>();
+            deleteAsync(partitionedTopicPath).whenComplete((ignore, ex) -> {
+                if (ex != null && ex.getCause().getCause() instanceof 
KeeperException.NoNodeException) {
+                    future.complete(null);
+                } else if (ex != null) {
+                    future.completeExceptionally(ex);
+                } else {
+                    future.complete(null);
+                }
+            });
+            return future;
+        }
     }
 
 
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 29b46990ca4..5bd9dc8bd0f 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
@@ -264,6 +264,10 @@ public class TenantsBase extends PulsarWebResource {
                             .clearTenantPersistence(tenant))
                     .thenCompose(ignore -> 
pulsar().getPulsarResources().getNamespaceResources()
                             .deleteTenantAsync(tenant))
+                    .thenCompose(ignore -> 
pulsar().getPulsarResources().getNamespaceResources()
+                            
.getPartitionedTopicResources().clearPartitionedTopicTenantAsync(tenant))
+                    .thenCompose(ignore -> 
pulsar().getPulsarResources().getLocalPolicies()
+                            .deleteLocalPoliciesTenantAsync(tenant))
                     .thenCompose(ignore -> 
pulsar().getPulsarResources().getNamespaceResources()
                             .deleteBundleDataTenantAsync(tenant))
                     .whenComplete((ignore, ex) -> {
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java
index e0fac522f27..8bc72d40d97 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApi2Test.java
@@ -1313,8 +1313,12 @@ public class AdminApi2Test extends 
MockedPulsarServiceBaseTest {
 
         final String managedLedgersPath = "/managed-ledgers/" + tenant;
         final String bundleDataPath = "/loadbalance/bundle-data/" + tenant;
+        final String partitionedTopicPath = "/admin/partitioned-topics/" + 
tenant;
+        final String localPoliciesPath = "/admin/local-policies/" + tenant;
         
assertFalse(pulsar.getLocalMetadataStore().exists(managedLedgersPath).join());
         
assertFalse(pulsar.getLocalMetadataStore().exists(bundleDataPath).join());
+        
assertFalse(pulsar.getLocalMetadataStore().exists(partitionedTopicPath).join());
+        
assertFalse(pulsar.getLocalMetadataStore().exists(localPoliciesPath).join());
     }
 
     @Test

Reply via email to