You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by xi...@apache.org on 2022/12/06 00:42:22 UTC

[pulsar] 01/02: Pulsar Admin: grab contextual stacktrace for sync methods (#14620)

This is an automated email from the ASF dual-hosted git repository.

xiangying pushed a commit to branch branch-2.10
in repository https://gitbox.apache.org/repos/asf/pulsar.git

commit b3f31acf2a3c4c0ccebdacb8db083753bb70bdb2
Author: Enrico Olivelli <eo...@apache.org>
AuthorDate: Tue Mar 29 11:39:17 2022 +0200

    Pulsar Admin: grab contextual stacktrace for sync methods (#14620)
    
    (cherry picked from commit 1730415bece2d779cf2d978f043209b5888ed2f8)
---
 .../pulsar/client/admin/PulsarAdminException.java  | 77 ++++++++++++++++++++++
 .../pulsar/client/admin/internal/BaseResource.java |  9 ++-
 .../client/admin/internal/TopicPoliciesImpl.java   | 15 +----
 3 files changed, 84 insertions(+), 17 deletions(-)

diff --git a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminException.java b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminException.java
index 041f8a659f4..6e0285d7d1e 100644
--- a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminException.java
+++ b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminException.java
@@ -69,6 +69,15 @@ public class PulsarAdminException extends Exception {
         return statusCode;
     }
 
+    /**
+     * This method is meant to be overriden by all subclasses.
+     * We cannot make it 'abstract' because it would be a breaking change in the public API.
+     * @return a new PulsarAdminException
+     */
+    protected PulsarAdminException clone() {
+        return new PulsarAdminException(getMessage(), getCause(), httpError, statusCode);
+    }
+
     /**
      * Not Authorized Exception.
      */
@@ -76,6 +85,11 @@ public class PulsarAdminException extends Exception {
         public NotAuthorizedException(Throwable t, String httpError, int statusCode) {
             super(httpError, t, httpError, statusCode);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new NotAuthorizedException(getCause(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -85,6 +99,11 @@ public class PulsarAdminException extends Exception {
         public NotFoundException(Throwable t, String httpError, int statusCode) {
             super(httpError, t, httpError, statusCode);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new NotFoundException(getCause(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -94,6 +113,11 @@ public class PulsarAdminException extends Exception {
         public NotAllowedException(Throwable t, String httpError, int statusCode) {
             super(httpError, t, httpError, statusCode);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new NotAllowedException(getCause(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -103,6 +127,11 @@ public class PulsarAdminException extends Exception {
         public ConflictException(Throwable t, String httpError, int statusCode) {
             super(httpError, t, httpError, statusCode);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new ConflictException(getCause(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -112,6 +141,11 @@ public class PulsarAdminException extends Exception {
         public PreconditionFailedException(Throwable t, String httpError, int statusCode) {
             super(httpError, t, httpError, statusCode);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new PreconditionFailedException(getCause(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -121,6 +155,11 @@ public class PulsarAdminException extends Exception {
         public TimeoutException(Throwable t) {
             super(t);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new TimeoutException(getCause());
+        }
     }
 
     /**
@@ -131,9 +170,15 @@ public class PulsarAdminException extends Exception {
             super(message, t, httpError, statusCode);
         }
 
+        @Deprecated
         public ServerSideErrorException(Throwable t) {
             super("Some error occourred on the server", t);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new ServerSideErrorException(getCause(), getMessage(), getHttpError(), getStatusCode());
+        }
     }
 
     /**
@@ -147,6 +192,11 @@ public class PulsarAdminException extends Exception {
         public HttpErrorException(Throwable t) {
             super(t);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new HttpErrorException(getCause());
+        }
     }
 
     /**
@@ -160,6 +210,11 @@ public class PulsarAdminException extends Exception {
         public ConnectException(String message, Throwable t) {
             super(message, t);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new ConnectException(getMessage(), getCause());
+        }
     }
 
     /**
@@ -170,8 +225,30 @@ public class PulsarAdminException extends Exception {
             super(t);
         }
 
+        @Deprecated
         public GettingAuthenticationDataException(String msg) {
             super(msg);
         }
+
+        @Override
+        protected PulsarAdminException clone() {
+            return new GettingAuthenticationDataException(getCause());
+        }
+    }
+
+    /**
+     * Clone the exception and grab the current stacktrace.
+     * @param e a PulsarAdminException
+     * @return a new PulsarAdminException, of the same class.
+     */
+    public static PulsarAdminException wrap(PulsarAdminException e) {
+        PulsarAdminException cloned =  e.clone();
+        if (e.getClass() != cloned.getClass()) {
+            throw new IllegalStateException("Cloning a " + e.getClass() + " generated a "
+                    + cloned.getClass() + ", this is a bug, original error is " + e, e);
+        }
+        // adding a reference to the original exception.
+        cloned.addSuppressed(e);
+        return (PulsarAdminException) cloned.fillInStackTrace();
     }
 }
diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java
index 6df43c29b8f..4625c01fcef 100644
--- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java
+++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/BaseResource.java
@@ -290,15 +290,18 @@ public abstract class BaseResource {
     protected <T> T sync(Supplier<CompletableFuture<T>> executor) throws PulsarAdminException {
         try {
             return executor.get().get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
-        } catch (ExecutionException e) {
-           throw (PulsarAdminException) e.getCause();
         } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
           throw new PulsarAdminException(e);
         } catch (TimeoutException e) {
           throw new PulsarAdminException.TimeoutException(e);
+        } catch (ExecutionException e) {
+            // we want to have a stacktrace that points to this point, in order to return a meaninful
+            // stacktrace to the user, otherwise we will have a stacktrace
+            // related to another thread, because all Admin API calls are async
+            throw PulsarAdminException.wrap(getApiException(e.getCause()));
         } catch (Exception e) {
-            throw getApiException(e);
+            throw PulsarAdminException.wrap(getApiException(e));
         }
     }
 }
diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java
index 2caf1876f51..bd300377807 100644
--- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java
+++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/TopicPoliciesImpl.java
@@ -21,9 +21,6 @@ package org.apache.pulsar.client.admin.internal;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.InvocationCallback;
 import javax.ws.rs.client.WebTarget;
@@ -1237,17 +1234,7 @@ public class TopicPoliciesImpl extends BaseResource implements TopicPolicies {
 
     @Override
     public void removeSubscriptionTypesEnabled(String topic) throws PulsarAdminException {
-        try {
-            removeSubscriptionTypesEnabledAsync(topic)
-                    .get(this.readTimeoutMs, TimeUnit.MILLISECONDS);
-        } catch (ExecutionException e) {
-            throw (PulsarAdminException) e.getCause();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new PulsarAdminException(e);
-        } catch (TimeoutException e) {
-            throw new PulsarAdminException.TimeoutException(e);
-        }
+        sync(() -> removeSubscriptionTypesEnabledAsync(topic));
     }
 
     @Override