This is an automated email from the ASF dual-hosted git repository. xiangying pushed a commit to branch xaingying/cherry-pick-2.10/improve_test in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit a3e593abbcb3a88509816ccf584823478f21aa74 Author: fengyubiao <[email protected]> AuthorDate: Thu Nov 24 15:20:44 2022 +0800 [fix][test] Fix flaky test deleteNamespaceGracefully (#18220) (cherry picked from commit c544ea3aae1a8be8e7bcd4f89fb1899ce0a3350f) --- .../apache/pulsar/broker/admin/AdminApi2Test.java | 8 +- .../apache/pulsar/broker/admin/AdminApiTest.java | 38 +++--- .../pulsar/broker/admin/AdminApiTlsAuthTest.java | 2 +- .../broker/auth/MockedPulsarServiceBaseTest.java | 142 +++++++++++++++++++++ .../namespace/NamespaceOwnershipListenerTests.java | 13 +- .../OwnerShipForCurrentServerTestBase.java | 3 +- .../ResourceGroupConfigListenerTest.java | 2 +- .../broker/service/BacklogQuotaManagerTest.java | 25 +++- .../BrokerServiceBundlesCacheInvalidationTest.java | 2 +- .../broker/service/PersistentTopicE2ETest.java | 4 +- .../broker/transaction/TransactionTestBase.java | 21 ++- .../client/api/DispatcherBlockConsumerTest.java | 3 +- 12 files changed, 221 insertions(+), 42 deletions(-) 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 fcc2f144907..3c99452fdc0 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 @@ -1386,7 +1386,7 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { assertTrue(admin.topics().getList(namespace).isEmpty()); // delete namespace - admin.namespaces().deleteNamespace(namespace, false); + deleteNamespaceWithRetry(namespace, false); assertFalse(admin.namespaces().getNamespaces(tenant).contains(namespace)); assertTrue(admin.namespaces().getNamespaces(tenant).isEmpty()); @@ -1475,7 +1475,7 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { admin.topics().deletePartitionedTopic(topic); // delete namespace - admin.namespaces().deleteNamespace(namespace, false); + deleteNamespaceWithRetry(namespace, false); assertFalse(admin.namespaces().getNamespaces(tenant).contains(namespace)); assertTrue(admin.namespaces().getNamespaces(tenant).isEmpty()); @@ -1572,7 +1572,7 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { }); producer.close(); admin.topics().delete(topic); - admin.namespaces().deleteNamespace(namespace); + deleteNamespaceWithRetry(namespace, false); Awaitility.await().untilAsserted(() -> { assertTrue(admin.namespaces().getNamespaces(tenant).isEmpty()); }); @@ -1783,7 +1783,7 @@ public class AdminApi2Test extends MockedPulsarServiceBaseTest { final String topic = "persistent://" + namespaceName + "/test" + UUID.randomUUID(); pulsarClient.newProducer(Schema.DOUBLE).topic(topic).create().close(); Awaitility.await().untilAsserted(() -> assertNotNull(admin.schemas().getSchemaInfo(topic))); - admin.namespaces().deleteNamespace(namespaceName, true); + deleteNamespaceWithRetry(namespaceName, true); try { admin.schemas().getSchemaInfo(topic); } catch (PulsarAdminException e) { diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java index 3f151daf8d2..a9ba361bbb9 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java @@ -196,7 +196,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { pulsar.getConfiguration().setForceDeleteNamespaceAllowed(true); for (String tenant : admin.tenants().getTenants()) { for (String namespace : admin.namespaces().getNamespaces(tenant)) { - deleteNamespaceGraceFully(namespace, true); + deleteNamespaceWithRetry(namespace, true); } admin.tenants().deleteTenant(tenant, true); } @@ -291,7 +291,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { Awaitility.await() .untilAsserted(() -> assertEquals(admin.clusters().getClusters(), Lists.newArrayList("test"))); - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); admin.clusters().deleteCluster("test"); assertEquals(admin.clusters().getClusters(), Lists.newArrayList()); @@ -516,7 +516,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { String.format("%s:%d", parts[0], pulsar.getListenPortHTTPS().get())); Assert.assertEquals(nsMap2.size(), 2); - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); admin.clusters().deleteCluster("test"); assertEquals(admin.clusters().getClusters(), Lists.newArrayList()); } @@ -710,7 +710,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { } @Test - public void properties() throws PulsarAdminException { + public void properties() throws Exception { try { admin.tenants().getTenantInfo("does-not-exist"); fail("should have failed"); @@ -739,7 +739,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { assertEquals(e.getStatusCode(), 409); assertEquals(e.getMessage(), "The tenant still has active namespaces"); } - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); admin.tenants().deleteTenant("prop-xyz"); assertEquals(admin.tenants().getTenants(), Lists.newArrayList()); @@ -768,7 +768,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { assertEquals(admin.namespaces().getPolicies("prop-xyz/ns3").bundles.getNumBundles(), 4); assertEquals(admin.namespaces().getPolicies("prop-xyz/ns3").bundles.getBoundaries().size(), 5); - admin.namespaces().deleteNamespace("prop-xyz/ns3"); + deleteNamespaceWithRetry("prop-xyz/ns3", false); try { admin.namespaces().createNamespace("non-existing/ns1"); @@ -842,7 +842,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { } assertTrue(i < 10); - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); assertEquals(admin.namespaces().getNamespaces("prop-xyz"), Lists.newArrayList("prop-xyz/ns2")); try { @@ -1266,7 +1266,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { @Test(dataProvider = "numBundles") public void testDeleteNamespaceBundle(Integer numBundles) throws Exception { - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); admin.namespaces().createNamespace("prop-xyz/ns1-bundles", numBundles); admin.namespaces().setNamespaceReplicationClusters("prop-xyz/ns1-bundles", Sets.newHashSet("test")); @@ -1278,8 +1278,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { assertEquals(admin.namespaces().getTopics("prop-xyz/ns1-bundles"), Lists.newArrayList()); - admin.namespaces().deleteNamespace("prop-xyz/ns1-bundles"); - assertEquals(admin.namespaces().getNamespaces("prop-xyz", "test"), Lists.newArrayList()); + deleteNamespaceWithRetry("prop-xyz/ns1-bundles", false); + assertEquals(admin.namespaces().getNamespaces("prop-xyz", "test"), new ArrayList<>()); } @Test @@ -1372,7 +1372,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { } // delete namespace forcefully - admin.namespaces().deleteNamespace(namespace, true); + deleteNamespaceWithRetry(namespace, true); assertFalse(admin.namespaces().getNamespaces(tenant).contains(namespace)); assertTrue(admin.namespaces().getNamespaces(tenant).isEmpty()); @@ -1432,7 +1432,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { @Test public void testNamespaceSplitBundle() throws Exception { - admin.namespaces().createNamespace("prop-xyz/splitBundle", Set.of("test")); + admin.namespaces().createNamespace("prop-xyz/splitBundle", Sets.newHashSet("test")); // Force to create a topic final String namespace = "prop-xyz/splitBundle"; @@ -1656,7 +1656,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { @Test public void testNamespaceUnloadBundle() throws Exception { - admin.namespaces().createNamespace("prop-xyz/unloadBundle", Set.of("test")); + admin.namespaces().createNamespace("prop-xyz/unloadBundle", Sets.newHashSet("test")); assertEquals(admin.topics().getList("prop-xyz/unloadBundle"), new ArrayList<>()); @@ -2086,7 +2086,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { assertEquals(result.someNewIntField, 0); assertNull(result.someNewString); - admin.namespaces().deleteNamespace("prop-xyz/ns1"); + deleteNamespaceWithRetry("prop-xyz/ns1", false); admin.tenants().deleteTenant("prop-xyz"); assertEquals(admin.tenants().getTenants(), Lists.newArrayList()); } @@ -2974,9 +2974,9 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { admin.topics().delete(topic1); admin.topics().delete(topic2); admin.topics().delete(topic3); - admin.namespaces().deleteNamespace(namespace1); - admin.namespaces().deleteNamespace(namespace2); - admin.namespaces().deleteNamespace(namespace3); + deleteNamespaceWithRetry(namespace1, false); + deleteNamespaceWithRetry(namespace2, false); + deleteNamespaceWithRetry(namespace3, false); } @Test @@ -2989,11 +2989,11 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest { String ns = BrokerTestUtil.newUniqueName("prop-xyz/ns"); admin.namespaces().createNamespace(ns, 24); - admin.namespaces().deleteNamespace(ns); + deleteNamespaceWithRetry(ns, false); // Re-create and re-delete admin.namespaces().createNamespace(ns, 32); - admin.namespaces().deleteNamespace(ns); + deleteNamespaceWithRetry(ns, false); } @Test diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java index 311e31be735..11b806a656f 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTlsAuthTest.java @@ -443,7 +443,7 @@ public class AdminApiTlsAuthTest extends MockedPulsarServiceBaseTest { admin.topics().delete("tenant1/ns1/foobar", true); log.info("Deleting namespace"); - admin.namespaces().deleteNamespace("tenant1/ns1"); + deleteNamespaceWithRetry("tenant1/ns1", false, admin); } } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java index 84964680d34..4f3af27a384 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/auth/MockedPulsarServiceBaseTest.java @@ -33,13 +33,20 @@ import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.TimeoutHandler; import org.apache.bookkeeper.client.BookKeeper; import org.apache.bookkeeper.client.EnsemblePlacementPolicy; import org.apache.bookkeeper.client.PulsarMockBookKeeper; @@ -51,6 +58,7 @@ import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; import org.apache.pulsar.broker.intercept.CounterBrokerInterceptor; import org.apache.pulsar.broker.namespace.NamespaceService; +import org.apache.pulsar.broker.service.BrokerTestBase; import org.apache.pulsar.client.admin.PulsarAdmin; import org.apache.pulsar.client.admin.PulsarAdminBuilder; import org.apache.pulsar.client.admin.PulsarAdminException; @@ -67,6 +75,7 @@ import org.apache.pulsar.tests.TestRetrySupport; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.MockZooKeeper; import org.apache.zookeeper.data.ACL; +import org.awaitility.Awaitility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.DataProvider; @@ -498,6 +507,139 @@ public abstract class MockedPulsarServiceBaseTest extends TestRetrySupport { } } + protected Object asyncRequests(Consumer<TestAsyncResponse> function) throws Exception { + TestAsyncResponse ctx = new TestAsyncResponse(); + function.accept(ctx); + ctx.latch.await(); + if (ctx.e != null) { + throw (Exception) ctx.e; + } + return ctx.response; + } + + public static class TestAsyncResponse implements AsyncResponse { + + Object response; + Throwable e; + CountDownLatch latch = new CountDownLatch(1); + + @Override + public boolean resume(Object response) { + this.response = response; + latch.countDown(); + return true; + } + + @Override + public boolean resume(Throwable response) { + this.e = response; + latch.countDown(); + return true; + } + + @Override + public boolean cancel() { + return false; + } + + @Override + public boolean cancel(int retryAfter) { + return false; + } + + @Override + public boolean cancel(Date retryAfter) { + return false; + } + + @Override + public boolean isSuspended() { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return false; + } + + @Override + public boolean setTimeout(long time, TimeUnit unit) { + return false; + } + + @Override + public void setTimeoutHandler(TimeoutHandler handler) { + + } + + @Override + public Collection<Class<?>> register(Class<?> callback) { + return null; + } + + @Override + public Map<Class<?>, Collection<Class<?>>> register(Class<?> callback, Class<?>... callbacks) { + return null; + } + + @Override + public Collection<Class<?>> register(Object callback) { + return null; + } + + @Override + public Map<Class<?>, Collection<Class<?>>> register(Object callback, Object... callbacks) { + return null; + } + + } + + /** + * see {@link BrokerTestBase#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force) + throws Exception { + BrokerTestBase.deleteNamespaceWithRetry(ns, force, admin, pulsar); + } + + /** + * see {@link BrokerTestBase#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force, PulsarAdmin admin) + throws Exception { + BrokerTestBase.deleteNamespaceWithRetry(ns, force, admin, pulsar); + } + + /** + * see {@link MockedPulsarServiceBaseTest#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + public static void deleteNamespaceWithRetry(String ns, boolean force, PulsarAdmin admin, PulsarService...pulsars) + throws Exception { + deleteNamespaceWithRetry(ns, force, admin, Arrays.asList(pulsars)); + } + + /** + * 1. Pause system "__change_event" topic creates. + * 2. Do delete namespace with retry because maybe fail by race-condition with create topics. + */ + public static void deleteNamespaceWithRetry(String ns, boolean force, PulsarAdmin admin, + Collection<PulsarService> pulsars) throws Exception { + Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> { + try { + // Maybe fail by race-condition with create topics, just retry. + admin.namespaces().deleteNamespace(ns, force); + return true; + } catch (Exception ex) { + return false; + } + }); + } + @DataProvider(name = "invalidPersistentPolicies") public Object[][] incorrectPersistentPolicies() { return new Object[][] { diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceOwnershipListenerTests.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceOwnershipListenerTests.java index c0a46881628..2738ab897d2 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceOwnershipListenerTests.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceOwnershipListenerTests.java @@ -55,7 +55,7 @@ public class NamespaceOwnershipListenerTests extends BrokerTestBase { } @Test - public void testNamespaceBundleOwnershipListener() throws PulsarAdminException, InterruptedException, PulsarClientException { + public void testNamespaceBundleOwnershipListener() throws Exception { final CountDownLatch countDownLatch = new CountDownLatch(2); final AtomicBoolean onLoad = new AtomicBoolean(false); @@ -101,11 +101,11 @@ public class NamespaceOwnershipListenerTests extends BrokerTestBase { Assert.assertTrue(onLoad.get()); Assert.assertTrue(unLoad.get()); admin.topics().delete(topic); - admin.namespaces().deleteNamespace(namespace); + deleteNamespaceWithRetry(namespace, false); } @Test - public void testGetAllPartitions() throws PulsarAdminException, ExecutionException, InterruptedException { + public void testGetAllPartitions() throws Exception { final String namespace = "prop/" + UUID.randomUUID().toString(); admin.namespaces().createNamespace(namespace, Sets.newHashSet("test")); assertTrue(admin.namespaces().getNamespaces("prop").contains(namespace)); @@ -122,12 +122,11 @@ public class NamespaceOwnershipListenerTests extends BrokerTestBase { } admin.topics().deletePartitionedTopic(topicName); - admin.namespaces().deleteNamespace(namespace); + deleteNamespaceWithRetry(namespace, false); } @Test - public void testNamespaceBundleLookupOnwershipListener() throws PulsarAdminException, InterruptedException, - PulsarClientException { + public void testNamespaceBundleLookupOnwershipListener() throws Exception { final CountDownLatch countDownLatch = new CountDownLatch(2); final AtomicInteger onLoad = new AtomicInteger(0); final AtomicInteger unLoad = new AtomicInteger(0); @@ -172,6 +171,6 @@ public class NamespaceOwnershipListenerTests extends BrokerTestBase { Assert.assertEquals(onLoad.get(), 1); Assert.assertEquals(unLoad.get(), 1); admin.topics().delete(topic); - admin.namespaces().deleteNamespace(namespace); + deleteNamespaceWithRetry(namespace, false); } } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/OwnerShipForCurrentServerTestBase.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/OwnerShipForCurrentServerTestBase.java index c25c6c23fb0..80558361f4b 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/OwnerShipForCurrentServerTestBase.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/OwnerShipForCurrentServerTestBase.java @@ -130,7 +130,8 @@ public class OwnerShipForCurrentServerTestBase { MockZooKeeperSession mockZooKeeperSession = MockZooKeeperSession.newInstance(mockZooKeeper); doReturn(new ZKMetadataStore(mockZooKeeperSession)).when(pulsar).createLocalMetadataStore(); doReturn(new ZKMetadataStore(mockZooKeeperSession)).when(pulsar).createConfigurationMetadataStore(); - Supplier<NamespaceService> namespaceServiceSupplier = () -> spyWithClassAndConstructorArgs(NamespaceService.class, pulsar); + Supplier<NamespaceService> namespaceServiceSupplier = () -> spyWithClassAndConstructorArgs( + NamespaceService.class, pulsar); doReturn(namespaceServiceSupplier).when(pulsar).getNamespaceServiceProvider(); SameThreadOrderedSafeExecutor executor = new SameThreadOrderedSafeExecutor(); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java index 38cae3253fe..64c5fee14d0 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/resourcegroup/ResourceGroupConfigListenerTest.java @@ -197,7 +197,7 @@ public class ResourceGroupConfigListenerTest extends MockedPulsarServiceBaseTest assertNull(pulsar.getResourceGroupServiceManager() .getNamespaceResourceGroup(NamespaceName.get(namespaceName)))); - admin.namespaces().deleteNamespace(namespaceName); + deleteNamespaceWithRetry(namespaceName, false); deleteResourceGroup(rgName); } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java index 1d2878ca644..96fc452745b 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java @@ -40,6 +40,7 @@ import org.apache.bookkeeper.mledger.Position; import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; +import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.service.persistent.PersistentTopic; import org.apache.pulsar.client.admin.GetStatsOptions; import org.apache.pulsar.client.admin.PulsarAdmin; @@ -82,6 +83,22 @@ public class BacklogQuotaManagerTest { private static final int TIME_TO_CHECK_BACKLOG_QUOTA = 2; private static final int MAX_ENTRIES_PER_LEDGER = 5; + /** + * see {@link MockedPulsarServiceBaseTest#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force) + throws Exception { + MockedPulsarServiceBaseTest.deleteNamespaceWithRetry(ns, force, admin, pulsar); + } + + /** + * see {@link MockedPulsarServiceBaseTest#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force, PulsarAdmin admin) + throws Exception { + MockedPulsarServiceBaseTest.deleteNamespaceWithRetry(ns, force, admin, pulsar); + } + @DataProvider(name = "backlogQuotaSizeGB") public Object[][] backlogQuotaSizeGB() { return new Object[][] { { true }, { false } }; @@ -158,10 +175,10 @@ public class BacklogQuotaManagerTest { } @AfterMethod(alwaysRun = true) - void clearNamespaces() throws PulsarAdminException { - admin.namespaces().deleteNamespace("prop/ns-quota", true); - admin.namespaces().deleteNamespace("prop/quotahold", true); - admin.namespaces().deleteNamespace("prop/quotaholdasync", true); + void clearNamespaces() throws Exception { + deleteNamespaceWithRetry("prop/ns-quota", true); + deleteNamespaceWithRetry("prop/quotahold", true); + deleteNamespaceWithRetry("prop/quotaholdasync", true); } private void rolloverStats() { diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceBundlesCacheInvalidationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceBundlesCacheInvalidationTest.java index 573d473ed58..a55540c3f4f 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceBundlesCacheInvalidationTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceBundlesCacheInvalidationTest.java @@ -59,7 +59,7 @@ public class BrokerServiceBundlesCacheInvalidationTest extends BrokerTestBase { // Delete and recreate with 32 bundles admin.topics().delete(topic); - admin.namespaces().deleteNamespace(namespace, false); + deleteNamespaceWithRetry(namespace, false); admin.namespaces().createNamespace(namespace, 32); BundlesData bundlesData = admin.namespaces().getBundles(namespace); diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java index 54dc706016b..fdd1170c21b 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java @@ -958,7 +958,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase { consumer.close(); admin.topics().deleteSubscription(topicName, subName); admin.topics().delete(topicName); - admin.namespaces().deleteNamespace(namespaceName); + deleteNamespaceWithRetry(namespaceName, false); } @Test @@ -1052,7 +1052,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase { consumer.close(); admin.topics().deleteSubscription(topicName, subName); admin.topics().delete(topicName); - admin.namespaces().deleteNamespace(namespaceName, true); + deleteNamespaceWithRetry(namespaceName, true); } catch (PulsarAdminException e) { Assert.assertEquals(e.getStatusCode(), 500); } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/transaction/TransactionTestBase.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/transaction/TransactionTestBase.java index 25c555f09b9..990f63011b3 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/transaction/TransactionTestBase.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/transaction/TransactionTestBase.java @@ -44,9 +44,11 @@ import org.apache.bookkeeper.util.ZkUtils; import org.apache.pulsar.broker.BookKeeperClientFactory; import org.apache.pulsar.broker.PulsarService; import org.apache.pulsar.broker.ServiceConfiguration; +import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest; import org.apache.pulsar.broker.auth.SameThreadOrderedSafeExecutor; import org.apache.pulsar.broker.intercept.CounterBrokerInterceptor; import org.apache.pulsar.broker.namespace.NamespaceService; +import org.apache.pulsar.broker.service.BrokerTestBase; import org.apache.pulsar.client.admin.PulsarAdmin; import org.apache.pulsar.client.admin.PulsarAdminBuilder; import org.apache.pulsar.client.api.ClientBuilder; @@ -198,7 +200,8 @@ public abstract class TransactionTestBase extends TestRetrySupport { MockZooKeeperSession mockZooKeeperSession = MockZooKeeperSession.newInstance(mockZooKeeper); doReturn(new ZKMetadataStore(mockZooKeeperSession)).when(pulsar).createLocalMetadataStore(); doReturn(new ZKMetadataStore(mockZooKeeperSession)).when(pulsar).createConfigurationMetadataStore(); - Supplier<NamespaceService> namespaceServiceSupplier = () -> spyWithClassAndConstructorArgs(NamespaceService.class, pulsar); + Supplier<NamespaceService> namespaceServiceSupplier = + () -> spyWithClassAndConstructorArgs(NamespaceService.class, pulsar); doReturn(namespaceServiceSupplier).when(pulsar).getNamespaceServiceProvider(); SameThreadOrderedSafeExecutor executor = new SameThreadOrderedSafeExecutor(); @@ -330,4 +333,20 @@ public abstract class TransactionTestBase extends TestRetrySupport { log.warn("Failed to clean up mocked pulsar service:", e); } } + + /** + * see {@link BrokerTestBase#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force) + throws Exception { + MockedPulsarServiceBaseTest.deleteNamespaceWithRetry(ns, force, admin, pulsarServiceList); + } + + /** + * see {@link MockedPulsarServiceBaseTest#deleteNamespaceWithRetry(String, boolean, PulsarAdmin, Collection)} + */ + protected void deleteNamespaceWithRetry(String ns, boolean force, PulsarAdmin admin) + throws Exception { + MockedPulsarServiceBaseTest.deleteNamespaceWithRetry(ns, force, admin, pulsarServiceList); + } } diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java index 1a56d689799..df695cbf715 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java @@ -631,7 +631,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase { // if broker unload bundle gracefully then cursor metadata recovered from zk else from ledger if (unloadBundleGracefully) { // set clean namespace which will not let broker unload bundle gracefully: stop broker - Supplier<NamespaceService> namespaceServiceSupplier = () -> spyWithClassAndConstructorArgs(NamespaceService.class, pulsar); + Supplier<NamespaceService> namespaceServiceSupplier = + () -> spyWithClassAndConstructorArgs(NamespaceService.class, pulsar); doReturn(namespaceServiceSupplier).when(pulsar).getNamespaceServiceProvider(); } stopBroker();
