From cc8282d2125193473a5336c56763b987e862d074 Mon Sep 17 00:00:00 2001 From: hanmz Date: Mon, 21 Oct 2024 15:52:16 +0800 Subject: [PATCH 1/2] [fix][broker]Not allow to create non-persistent partitioned topic if topic name contain '-partition-'. --- .../org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java index edf4303e1adef..92234bbd20f00 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java @@ -186,7 +186,7 @@ public void createPartitionedTopic( try { validateNamespaceName(tenant, namespace); validateGlobalNamespaceOwnership(); - validateTopicName(tenant, namespace, encodedTopic); + validatePartitionedTopicName(tenant, namespace, encodedTopic); internalCreatePartitionedTopic(asyncResponse, numPartitions, createLocalTopicOnly); } catch (Exception e) { log.error("[{}] Failed to create partitioned topic {}", clientAppId(), topicName, e); From 1277fb558b237ab7acf09c9da599ff53d5e3d807 Mon Sep 17 00:00:00 2001 From: hanmz Date: Mon, 28 Oct 2024 16:01:02 +0800 Subject: [PATCH 2/2] [fix][broker] Don't allow creating a non-persistent partitioned topic with '-partition-' in name --- .../broker/admin/PersistentTopicsTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java index 258c0183114fd..78cecae33b5bd 100644 --- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java +++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/PersistentTopicsTest.java @@ -2011,4 +2011,20 @@ public void testPeekMessageWithProperties() throws Exception { assertEquals(batchMessage.getProperties().get("BaTcH-kEy3"), "BaTcH-vAlUe3"); } } + + @Test + public void testCreateNonPersistentPartitionedTopic() { + AsyncResponse response = mock(AsyncResponse.class); + ArgumentCaptor responseCaptor = ArgumentCaptor.forClass(Response.class); + nonPersistentTopic.createPartitionedTopic(response, testTenant, testNamespace, "test-topic", 3, true); + verify(response, timeout(5000).times(1)).resume(responseCaptor.capture()); + Assert.assertEquals(responseCaptor.getValue().getStatus(), Response.Status.NO_CONTENT.getStatusCode()); + + response = mock(AsyncResponse.class); + ArgumentCaptor errorCaptor = ArgumentCaptor.forClass(RestException.class); + nonPersistentTopic.createPartitionedTopic(response, testTenant, testNamespace, "test-topic-partition-0", 3, true); + verify(response, timeout(5000).times(1)).resume(errorCaptor.capture()); + Assert.assertEquals(errorCaptor.getValue().getResponse().getStatus(), + Response.Status.PRECONDITION_FAILED.getStatusCode()); + } }