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

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

commit 5dd844df7e9226e8e2d02a8ac4be33ff43f2d046
Author: WangJialing <[email protected]>
AuthorDate: Sat Dec 5 00:50:08 2020 +0800

    fix force delete namespace did not delete all topics of the namespace 
(#8806)
    
    ### Motivation
    We found a issue that when force deleting a namespace, only topics owned by 
the broker were deleted, topics owned by other brokers were not deleted.
    The force delete namespace feature was added in #7993 .
    
    ### Modifications
    Use admin client to delete the topic, which could delete all topics include 
those owned by other brokers.
    
    
    (cherry picked from commit 75af6c25c8a79959d025d54326b433a5c6ae9c7e)
---
 .../pulsar/broker/admin/impl/NamespacesBase.java   |  9 ++++---
 .../apache/pulsar/broker/admin/NamespacesTest.java | 31 +++++++++++++++++++++-
 2 files changed, 36 insertions(+), 4 deletions(-)

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 2d7761a..4ce489c 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
@@ -414,9 +414,12 @@ public abstract class NamespacesBase extends AdminResource 
{
             // firstly remove all topics including system topics
             if (!topics.isEmpty()) {
                 for (String topic : topics) {
-                    
pulsar().getBrokerService().getTopicIfExists(topic).whenComplete((topicOptional,
 ex) -> {
-                        topicOptional.ifPresent(tp -> 
futures.add(tp.deleteForcefully()));
-                    });
+                    try {
+                        
futures.add(pulsar().getAdminClient().topics().deleteAsync(topic, true));
+                    } catch (Exception e) {
+                        log.error("[{}] Failed to force delete topic {}", 
clientAppId(), topic, e);
+                        asyncResponse.resume(new RestException(e));
+                    }
                 }
             }
             // forcefully delete namespace bundles
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
index 6e92644..b4a0ae8 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/NamespacesTest.java
@@ -1085,7 +1085,7 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
 
     /**
      * Verifies that deleteNamespace cleans up policies(global,local), bundle 
cache and bundle ownership
-     *
+
      * @throws Exception
      */
     @Test
@@ -1114,6 +1114,35 @@ public class NamespacesTest extends 
MockedPulsarServiceBaseTest {
 
     }
 
+    /**
+     * Verifies that force deleteNamespace delete all topics in the namespace
+     * @throws Exception
+     */
+    @Test
+    public void testForceDeleteNamespace() throws Exception {
+        String namespace = this.testTenant + "/namespace-" + System.nanoTime();
+        String topic = namespace + "/topic";
+
+        admin.namespaces().createNamespace(namespace, 100);
+
+        admin.topics().createPartitionedTopic(topic, 10);
+
+        List<String> topicList = admin.topics().getList(namespace);
+        assertFalse(topicList.isEmpty());
+
+        try {
+            admin.namespaces().deleteNamespace(namespace, false);
+            fail("should have failed");
+        } catch (PulsarAdminException e) {
+            // Expected: Cannot delete non empty namespace
+        }
+
+        admin.namespaces().deleteNamespace(namespace, true);
+        admin.namespaces().createNamespace(namespace, 100);
+        topicList = admin.topics().getList(namespace);
+        assertTrue(topicList.isEmpty());
+    }
+
     @Test
     public void testSubscribeRate() throws Exception {
         SubscribeRate subscribeRate = new SubscribeRate(1, 5);

Reply via email to