This is an automated email from the ASF dual-hosted git repository. technoboy pushed a commit to branch branch-2.11 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 27719c078774813eb28858290b3725aeec1a3f41 Author: Jiwei Guo <[email protected]> AuthorDate: Sun Aug 14 18:17:49 2022 +0800 [improve][admin] Unset namespace policy to improve deleting namespace. (#17033) --- .../org/apache/pulsar/broker/admin/impl/NamespacesBase.java | 11 ++++++----- .../java/org/apache/pulsar/broker/admin/AdminApi2Test.java | 12 ++++++++++++ 2 files changed, 18 insertions(+), 5 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 5139bbd00d5..fe6328dd102 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 @@ -478,16 +478,12 @@ public abstract class NamespacesBase extends AdminResource { if (topicName.isPartitioned()) { String partitionedTopic = topicName.getPartitionedTopicName(); if (!partitionedTopics.contains(partitionedTopic)) { - // Distinguish partitioned topic to avoid duplicate deletion of the same schema - topicFutures.add(pulsar().getAdminClient().topics().deletePartitionedTopicAsync( - partitionedTopic, true, true)); partitionedTopics.add(partitionedTopic); } } else { - topicFutures.add(pulsar().getAdminClient().topics().deleteAsync( - topic, true, true)); nonPartitionedTopics.add(topic); } + topicFutures.add(pulsar().getAdminClient().topics().deleteAsync(topic, true)); } catch (Exception e) { String errorMessage = String.format("Failed to force delete topic %s, " + "but the previous deletion command of partitioned-topics:%s " @@ -500,6 +496,11 @@ public abstract class NamespacesBase extends AdminResource { } } + for (String partitionedTopic : partitionedTopics) { + topicFutures.add(namespaceResources().getPartitionedTopicResources() + .deletePartitionedTopicAsync(TopicName.get(partitionedTopic))); + } + if (log.isDebugEnabled()) { log.debug("Successfully send deletion command of partitioned-topics:{} " + "and non-partitioned-topics:{} in namespace:{}.", 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 410ad097f6a..549eb9b6c0f 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 @@ -122,6 +122,7 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { @BeforeMethod @Override public void setup() throws Exception { + conf.setForceDeleteNamespaceAllowed(true); conf.setLoadBalancerEnabled(true); conf.setEnableNamespaceIsolationUpdateOnTime(true); super.internalSetup(); @@ -2548,4 +2549,15 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { () -> admin.topics().terminateTopic(eventTopic)); assertTrue(ex instanceof PulsarAdminException.NotAllowedException); } + + @Test + private void testDeleteNamespaceForciblyWithManyTopics() throws Exception { + final String ns = "prop-xyz/ns-testDeleteNamespaceForciblyWithManyTopics"; + admin.namespaces().createNamespace(ns, 2); + for (int i = 0; i < 100; i++) { + admin.topics().createPartitionedTopic(String.format("persistent://%s", ns + "/topic" + i), 3); + } + admin.namespaces().deleteNamespace(ns, true); + Assert.assertFalse(admin.namespaces().getNamespaces("prop-xyz").contains(ns)); + } }
