You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by zi...@apache.org on 2025/02/07 03:49:06 UTC
(pulsar) 02/04: [improve][broker] Do not print error logs for NotFound or Conflict errors when using the Admin API (#23928)
This is an automated email from the ASF dual-hosted git repository.
zike pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit ed03095579a1d11a9d866aa73ba0a5538f79c159
Author: Zike Yang <zi...@apache.org>
AuthorDate: Thu Feb 6 17:56:57 2025 +0800
[improve][broker] Do not print error logs for NotFound or Conflict errors when using the Admin API (#23928)
### Motivation
Currently, when there is a 404 or 409 error in the Admin API call, the broker prints the error logs.
```
ERROR org.apache.pulsar.broker.admin.v2.PersistentTopics - [xxx] Failed to get partitioned metadata topic persistent://xxx: Namespace not found
```
```
ERROR org.apache.pulsar.broker.admin.v2.Namespaces - Failed to get policies for namespace xxx: Namespace does not exist
```
```
ERROR org.apache.pulsar.broker.admin.v2.PersistentTopics - [xxx] Failed to create non-partitioned topic persistent:/xxx: This topic already exists
```
```
[pulsar-web-44-1] ERROR org.apache.pulsar.broker.admin.AdminResource - [admin] Failed to create partitioned topic persistent://xxx
java.util.concurrent.CompletionException: org.apache.pulsar.broker.web.RestException: This topic already exists
```
These errors are related to the client side. The client can handle the error, so we don't need to print it in the broker log.
### Modifications
- Print a warning log for NotFound or Conflict errors in the Admin API.
(cherry picked from commit 99dc74b0e268e549384ef2099f17c773101a79bb)
---
.../org/apache/pulsar/broker/admin/AdminResource.java | 18 +++++++++++++++++-
.../org/apache/pulsar/broker/admin/v2/Namespaces.java | 7 ++++++-
.../pulsar/broker/admin/v2/PersistentTopics.java | 4 ++--
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java
index 8754a005080..d2dc5eb787b 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/AdminResource.java
@@ -617,7 +617,12 @@ public abstract class AdminResource extends PulsarWebResource {
asyncResponse.resume(Response.noContent().build());
})
.exceptionally(ex -> {
- log.error("[{}] Failed to create partitioned topic {}", clientAppId(), topicName, ex);
+ if (AdminResource.isConflictException(ex)) {
+ log.info("[{}] Failed to create partitioned topic {}: {}", clientAppId(), topicName,
+ ex.getMessage());
+ } else {
+ log.error("[{}] Failed to create partitioned topic {}", clientAppId(), topicName, ex);
+ }
resumeAsyncResponseExceptionally(asyncResponse, ex);
return null;
});
@@ -881,6 +886,10 @@ public abstract class AdminResource extends PulsarWebResource {
== Status.TEMPORARY_REDIRECT.getStatusCode();
}
+ protected static boolean isNotFoundOrConflictException(Throwable ex) {
+ return isNotFoundException(ex) || isConflictException(ex);
+ }
+
protected static boolean isNotFoundException(Throwable ex) {
Throwable realCause = FutureUtil.unwrapCompletionException(ex);
return realCause instanceof WebApplicationException
@@ -888,6 +897,13 @@ public abstract class AdminResource extends PulsarWebResource {
== Status.NOT_FOUND.getStatusCode();
}
+ protected static boolean isConflictException(Throwable ex) {
+ Throwable realCause = FutureUtil.unwrapCompletionException(ex);
+ return realCause instanceof WebApplicationException
+ && ((WebApplicationException) realCause).getResponse().getStatus()
+ == Status.CONFLICT.getStatusCode();
+ }
+
protected static boolean isNot307And404Exception(Throwable ex) {
return !isRedirectException(ex) && !isNotFoundException(ex);
}
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
index 36150ee21b3..08c99085f80 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/Namespaces.java
@@ -47,6 +47,7 @@ import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
+import org.apache.pulsar.broker.admin.AdminResource;
import org.apache.pulsar.broker.admin.impl.NamespacesBase;
import org.apache.pulsar.broker.admin.impl.OffloaderObjectsScannerUtils;
import org.apache.pulsar.broker.web.RestException;
@@ -154,7 +155,11 @@ public class Namespaces extends NamespacesBase {
.thenCompose(__ -> getNamespacePoliciesAsync(namespaceName))
.thenAccept(response::resume)
.exceptionally(ex -> {
- log.error("Failed to get policies for namespace {}", namespaceName, ex);
+ if (AdminResource.isNotFoundOrConflictException(ex)) {
+ log.info("Failed to get policies for namespace {}: {}", namespaceName, ex.getMessage());
+ } else {
+ log.error("Failed to get policies for namespace {}", namespaceName, ex);
+ }
resumeAsyncResponseExceptionally(response, ex);
return null;
});
diff --git a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java
index d0fe3c7c745..ec19c4928b3 100644
--- a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java
+++ b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/PersistentTopics.java
@@ -346,7 +346,7 @@ public class PersistentTopics extends PersistentTopicsBase {
internalCreateNonPartitionedTopicAsync(authoritative, properties)
.thenAccept(__ -> asyncResponse.resume(Response.noContent().build()))
.exceptionally(ex -> {
- if (isNot307And404Exception(ex)) {
+ if (isNot307And404Exception(ex) && !isConflictException(ex)) {
log.error("[{}] Failed to create non-partitioned topic {}", clientAppId(), topicName, ex);
}
resumeAsyncResponseExceptionally(asyncResponse, ex);
@@ -946,7 +946,7 @@ public class PersistentTopics extends PersistentTopicsBase {
Throwable t = FutureUtil.unwrapCompletionException(ex);
if (!isRedirectException(t)) {
if (AdminResource.isNotFoundException(t)) {
- log.error("[{}] Failed to get partitioned metadata topic {}: {}",
+ log.info("[{}] Failed to get partitioned metadata topic {}: {}",
clientAppId(), topicName, ex.getMessage());
} else {
log.error("[{}] Failed to get partitioned metadata topic {}",