This is an automated email from the ASF dual-hosted git repository. rgao pushed a commit to branch branch-2.9 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 70617238125bb5f1bbd0529ae17957909e0a555a Author: Qiang Zhao <[email protected]> AuthorDate: Mon Jan 10 18:27:30 2022 +0800 [ Issue 13551 ] FIxed NPE when reset-cursor at a non-existent topic (RestException without cause) (#13573) (cherry picked from commit 78b28991d108f69a632d3e9e097c394ae8eae1ce) --- .../broker/admin/impl/PersistentTopicsBase.java | 2 +- .../org/apache/pulsar/broker/web/RestException.java | 5 ++--- .../pulsar/broker/admin/PersistentTopicsTest.java | 19 +++++++++++++++++++ 3 files changed, 22 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 a1481e0..b124e40 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 @@ -3643,7 +3643,7 @@ public class PersistentTopicsBase extends AdminResource { if (e.getCause() instanceof NotAllowedException) { throw new RestException(Status.BAD_REQUEST, e.getCause()); } - throw new RestException(e.getCause()); + throw new RestException(e.getCause() == null ? e : e.getCause()); } } diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java index 0cec819..2c01a7f 100644 --- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java +++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/web/RestException.java @@ -38,10 +38,9 @@ public class RestException extends WebApplicationException { writer.append("\n --- An unexpected error occurred in the server ---\n\n"); if (t != null) { writer.append("Message: ").append(t.getMessage()).append("\n\n"); + writer.append("Stacktrace:\n\n"); + t.printStackTrace(new PrintWriter(writer)); } - writer.append("Stacktrace:\n\n"); - - t.printStackTrace(new PrintWriter(writer)); return writer.toString(); } 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 00c4683..78f3d2e 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 @@ -43,6 +43,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; +import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.core.Response; @@ -56,6 +57,7 @@ import org.apache.pulsar.broker.resources.NamespaceResources; import org.apache.pulsar.broker.resources.PulsarResources; import org.apache.pulsar.broker.resources.TopicResources; import org.apache.pulsar.broker.service.BrokerService; +import org.apache.pulsar.broker.service.Topic; import org.apache.pulsar.broker.web.PulsarWebResource; import org.apache.pulsar.broker.web.RestException; import org.apache.pulsar.client.admin.PulsarAdminException; @@ -1146,4 +1148,21 @@ public class PersistentTopicsTest extends MockedPulsarServiceBaseTest { Assert.assertEquals(e.getResponse().getStatus(), 404); } } + + @Test + public void testResetCursorReturnTimeoutWhenZKTimeout() { + String topic = "persistent://" + testTenant + "/" + testNamespace + "/" + "topic-2"; + BrokerService brokerService = spy(pulsar.getBrokerService()); + doReturn(brokerService).when(pulsar).getBrokerService(); + CompletableFuture<Optional<Topic>> completableFuture = new CompletableFuture<>(); + doReturn(completableFuture).when(brokerService).getTopicIfExists(topic); + try { + admin.topics().resetCursor(topic, "my-sub", System.currentTimeMillis()); + Assert.fail(); + } catch (PulsarAdminException e) { + String errorMsg = ((InternalServerErrorException) e.getCause()).getResponse().readEntity(String.class); + Assert.assertTrue(errorMsg.contains("TimeoutException")); + } + } + }
