From eb8fb8226d08187e9df9dc4616a0ad3214a8fa6c Mon Sep 17 00:00:00 2001
From: Jiwei Guo <technoboy@apache.org>
Date: Thu, 21 Mar 2024 15:24:50 +0800
Subject: [PATCH] [improve][admin] Fix the `createMissingPartitions` doesn't
 response correctly (#22311)

(cherry picked from commit 5cabcacbfa8874931d501cd040f7a8ac3d6d1923)
(cherry picked from commit d4c05431def7364325988b0e8aea574992e83c79)
---
 .../pulsar/broker/admin/impl/PersistentTopicsBase.java     | 4 +++-
 .../apache/pulsar/broker/admin/PersistentTopicsTest.java   | 7 +++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
index d15aee2dc7624..52d273d5798e3 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java
@@ -500,7 +500,7 @@ protected CompletableFuture<Void> internalCreateNonPartitionedTopicAsync(boolean
 
     protected void internalCreateMissedPartitions(AsyncResponse asyncResponse) {
         getPartitionedTopicMetadataAsync(topicName, false, false).thenAccept(metadata -> {
-            if (metadata != null) {
+            if (metadata != null && metadata.partitions > 0) {
                 CompletableFuture<Void> future = validateNamespaceOperationAsync(topicName.getNamespaceObject(),
                         NamespaceOperation.CREATE_TOPIC);
                 future.thenCompose(__ -> tryCreatePartitionsAsync(metadata.partitions)).thenAccept(v -> {
@@ -510,6 +510,8 @@ protected void internalCreateMissedPartitions(AsyncResponse asyncResponse) {
                     resumeAsyncResponseExceptionally(asyncResponse, e);
                     return null;
                 });
+            } else {
+                throw new RestException(Status.NOT_FOUND, String.format("Topic %s does not exist", topicName));
             }
         }).exceptionally(ex -> {
             // If the exception is not redirect exception we need to log it.
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 c7b066faea9da..af7eeda7e4965 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
@@ -35,6 +35,7 @@
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertThrows;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -1811,4 +1812,10 @@ public void testUpdatePropertiesOnNonDurableSub() throws Exception {
         assertEquals(cursor.getCursorProperties().size(), 1);
         assertEquals(cursor.getCursorProperties().get("foo"), "bar");
     }
+
+    @Test
+    public void testCreateMissingPartitions() throws Exception {
+        String topicName = "persistent://" + testTenant + "/" + testNamespaceLocal + "/testCreateMissingPartitions";
+        assertThrows(PulsarAdminException.NotFoundException.class, () -> admin.topics().createMissedPartitions(topicName));
+    }
 }