This is an automated email from the ASF dual-hosted git repository.
lhotari pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new e15aedfcb3e [fix][broker] Fix incomplete futures in topic property
update/delete methods (#25228)
e15aedfcb3e is described below
commit e15aedfcb3e393745a771fae7030a138e87d07fc
Author: Cong Zhao <[email protected]>
AuthorDate: Mon Feb 9 16:03:25 2026 +0800
[fix][broker] Fix incomplete futures in topic property update/delete
methods (#25228)
(cherry picked from commit c2ae180a8f0eebdbbc45dd4b8f54ae1a7015d77d)
---
.../broker/admin/impl/PersistentTopicsBase.java | 18 +++++++++++---
.../apache/pulsar/broker/admin/AdminApi2Test.java | 29 ++++++++++++++++++++++
2 files changed, 43 insertions(+), 4 deletions(-)
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 54fc7d9c7a4..04d9e7e776f 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
@@ -730,8 +730,10 @@ public class PersistentTopicsBase extends AdminResource {
pulsar().getBrokerService().getTopicIfExists(topicName.toString())
.thenAccept(opt -> {
if (!opt.isPresent()) {
- throw new RestException(Status.NOT_FOUND,
- getTopicNotFoundErrorMessage(topicName.toString()));
+ future.completeExceptionally(
+ new
WebApplicationException(getTopicNotFoundErrorMessage(topicName.toString()),
+ Status.NOT_FOUND));
+ return;
}
ManagedLedger managedLedger = ((PersistentTopic)
opt.get()).getManagedLedger();
managedLedger.asyncSetProperties(properties, new
AsyncCallbacks.UpdatePropertiesCallback() {
@@ -751,6 +753,9 @@ public class PersistentTopicsBase extends AdminResource {
future.completeExceptionally(exception);
}
}, null);
+ }).exceptionally(ex -> {
+ future.completeExceptionally(ex);
+ return null;
});
return future;
}
@@ -787,8 +792,10 @@ public class PersistentTopicsBase extends AdminResource {
pulsar().getBrokerService().getTopicIfExists(topicName.toString())
.thenAccept(opt -> {
if (!opt.isPresent()) {
- throw new RestException(Status.NOT_FOUND,
-
getTopicNotFoundErrorMessage(topicName.toString()));
+ future.completeExceptionally(
+ new
WebApplicationException(getTopicNotFoundErrorMessage(topicName.toString()),
+ Status.NOT_FOUND));
+ return;
}
ManagedLedger managedLedger = ((PersistentTopic)
opt.get()).getManagedLedger();
managedLedger.asyncDeleteProperty(key, new
AsyncCallbacks.UpdatePropertiesCallback() {
@@ -803,6 +810,9 @@ public class PersistentTopicsBase extends AdminResource {
future.completeExceptionally(exception);
}
}, null);
+ }).exceptionally(ex -> {
+ future.completeExceptionally(ex);
+ return null;
});
return future;
}
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 ab90deb1e55..f8218fa54f6 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
@@ -1168,6 +1168,35 @@ public class AdminApi2Test extends
MockedPulsarServiceBaseTest {
Assert.assertEquals(properties.get("key2"), "value2");
}
+ @Test
+ public void testUpdatePropertiesOnNonExistentTopic() throws Exception {
+ final String namespace = newUniqueName(defaultTenant + "/ns2");
+ final String topicName = "persistent://" + namespace +
"/testUpdatePropertiesOnNonExistentTopic";
+ admin.namespaces().createNamespace(namespace, 20);
+
+ // Test updateProperties on non-existent topic should return 404 Not
Found
+ Map<String, String> topicProperties = new HashMap<>();
+ topicProperties.put("key1", "value1");
+ try {
+ admin.topics().updateProperties(topicName, topicProperties);
+ fail("Should have thrown an exception for non-existent topic");
+ } catch (Exception e) {
+ Assert.expectThrows(PulsarAdminException.NotFoundException.class,
() -> {
+ throw e;
+ });
+ }
+
+ // Test removeProperties on non-existent topic should return 404 Not
Found
+ try {
+ admin.topics().removeProperties(topicName, "key1");
+ fail("Should have thrown an exception for non-existent topic");
+ } catch (PulsarAdminException.NotFoundException e) {
+ Assert.expectThrows(PulsarAdminException.NotFoundException.class,
() -> {
+ throw e;
+ });
+ }
+ }
+
@Test
public void testNonPersistentTopics() throws Exception {
final String namespace = newUniqueName(defaultTenant + "/ns2");