hangc0276 opened a new issue #7189:
URL: https://github.com/apache/pulsar/issues/7189
**Describe the bug**
When I use flink to consume pulsar topic, flink-pulsar-connector will use
admin http request to get last messageId. However, i get the following
exception in broker side:
```
17:37:47.033 [pulsar-web-41-23] ERROR
org.apache.pulsar.broker.admin.impl.PersistentTopicsBase - [null] Failed to get
last messageId persistent://test/test/test-partition-22
javax.ws.rs.WebApplicationException: HTTP 307 Temporary Redirect
at
org.apache.pulsar.broker.web.PulsarWebResource.validateTopicOwnership(PulsarWebResource.java:596)
~[org.apache.pulsar-pulsar-broker-2.5.1.jar:2.5.1]
at
org.apache.pulsar.broker.admin.impl.PersistentTopicsBase.validateReadOperationOnTopic(PersistentTopicsBase.java:238)
~[org.apache.pulsar-pulsar-broker-2.5.1.jar:2.5.1]
at
org.apache.pulsar.broker.admin.impl.PersistentTopicsBase.internalGetLastMessageId(PersistentTopicsBase.java:2285)
[org.apache.pulsar-pulsar-broker-2.5.1.jar:2.5.1]
at
org.apache.pulsar.broker.admin.v2.PersistentTopics.getLastMessageId(PersistentTopics.java:1063)
[org.apache.pulsar-pulsar-broker-2.5.1.jar:2.5.1]
at jdk.internal.reflect.GeneratedMethodAccessor133.invoke(Unknown
Source) ~[?:?]
at
jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[?:?]
at java.lang.reflect.Method.invoke(Method.java:564) ~[?:?]
at
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:183)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
[org.glassfish.jersey.core-jersey-common-2.27.jar:?]
at
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
[org.glassfish.jersey.core-jersey-server-2.27.jar:?]
at
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
[org.glassfish.jersey.containers-jersey-container-servlet-core-2.27.jar:?]
at
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
[org.glassfish.jersey.containers-jersey-container-servlet-core-2.27.jar:?]
at
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
[o
```
When checking the code, i found the `Temporary Redirect` should be the
expected behavior when the request topic not owned by the current broker.
```
if (!nsService.isServiceUnitOwned(topicName)) {
boolean newAuthoritative = isLeaderBroker(pulsar());
// Replace the host and port of the current request and redirect
URI redirect =
UriBuilder.fromUri(uri.getRequestUri()).host(webUrl.get().getHost())
.port(webUrl.get().getPort()).replaceQueryParam("authoritative",
newAuthoritative).build();
// Redirect
log.debug("Redirecting the rest call to {}", redirect);
throw new
WebApplicationException(Response.temporaryRedirect(redirect).build());
}
```
**Expected behavior**
When the requested topic not owned by current broker, i will trigger
`Temporary Redirect`, and we should not use log error level to print the
exception stack.
In my opinion, printing the exception stack with debug level will better.
Because we will monitor the brokers' error messages and alert to the person on
duty.
@sijie @jiazhai @codelipenghui Could you give me some ideas?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]