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);
