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

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

commit 3c2c77dfd13cbf77fcecb6d163191a30daf2e0b8
Author: Zixuan Liu <[email protected]>
AuthorDate: Sat Oct 9 19:17:39 2021 +0800

    Improve exceptions thrown when handling the schema resource (#12155)
    
    Fixes #12010, #10694
    
    When handing the schema resource, if an error occurs, there are no more 
error message responses, and the client only knows that the server returns 500 
internal errors without the more helpful error message.
    
    You can use the `pulsarctl schemas upload test-schema-topic -f 
"./test.json"` command to upload this schema:
    ```
    { "type": "PROTOBUF", "schema": "syntax = \"proto3\";\n\npackage 
com.mycorp.mynamespace;\n\nimport 'google/protobuf/any.proto';\n \nmessage 
SampleRecord { \n\n int32 my_field1 = 1; \n double my_field2 = 2; \n string 
my_field3 = 3; \n}", "properties": {} }
    ```
    
    Before improvement:
    ```
    code: 500 reason: Unknown error
    ```
    
    After improvement:
    ```
    code: 500 reason:
     --- An unexpected error occurred in the server ---
    
    Message: 
org.apache.pulsar.broker.service.schema.exceptions.InvalidSchemaDataException: 
Invalid schema definition data for PROTOBUF schema
    
    Stacktrace:
    
    java.util.concurrent.CompletionException: 
org.apache.pulsar.broker.service.schema.exceptions.InvalidSchemaDataException: 
Invalid schema definition data for PROTOBUF schema
        at 
java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:331)
        at 
java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:743)
        at 
java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731)
        at 
java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2108)
        at 
org.apache.pulsar.broker.admin.impl.SchemasResourceBase.lambda$postSchema$6(SchemasResourceBase.java:168)
        at 
java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:753)
        at 
java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731)
        at 
java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2108)
        at 
org.apache.pulsar.broker.admin.impl.SchemasResourceBase.postSchema(SchemasResourceBase.java:139)
        at 
org.apache.pulsar.broker.admin.v2.SchemasResource.postSchema(SchemasResource.java:199)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at 
org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
        at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124)
        at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167)
        at 
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159)
        at 
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
        at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:475)
        at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:397)
        at 
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
        at 
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:255)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
        at 
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
        at 
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234)
        at 
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680)
        at 
org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394)
        at 
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
        at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366)
        at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319)
        at 
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
        at 
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
        at 
org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
        at 
org.apache.pulsar.broker.web.ResponseHandlerFilter.doFilter(ResponseHandlerFilter.java:67)
        at 
org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
        at 
org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
        at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        at 
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
        at 
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
        at 
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
        at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
        at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at 
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234)
        at 
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
        at 
org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:179)
        at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:516)
        at 
org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
        at 
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
        at 
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
        at 
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
        at 
org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: 
org.apache.pulsar.broker.service.schema.exceptions.InvalidSchemaDataException: 
Invalid schema definition data for PROTOBUF schema
        at 
org.apache.pulsar.broker.service.schema.validator.StructSchemaDataValidator.throwInvalidSchemaDataException(StructSchemaDataValidator.java:75)
        at 
org.apache.pulsar.broker.service.schema.validator.StructSchemaDataValidator.validate(StructSchemaDataValidator.java:65)
        at 
org.apache.pulsar.broker.service.schema.validator.SchemaDataValidator.validateSchemaData(SchemaDataValidator.java:42)
        at 
org.apache.pulsar.broker.service.schema.validator.SchemaRegistryServiceWithSchemaDataValidator.putSchemaIfAbsent(SchemaRegistryServiceWithSchemaDataValidator.java:92)
        at 
org.apache.pulsar.broker.admin.impl.SchemasResourceBase.lambda$postSchema$6(SchemasResourceBase.java:163)
        ... 68 more
    Caused by: org.apache.avro.SchemaParseException: 
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'syntax': was 
expecting (JSON String, Number, Array, Object or token 'null', 'true' or 
'false')
     at [Source: (String)"syntax = "proto3";
    
    package com.mycorp.mynamespace;
    
    import 'google/protobuf/any.proto';
    
    message SampleRecord {
    
     int32 my_field1 = 1;
     double my_field2 = 2;
     string my_field3 = 3;
    }"; line: 1, column: 7]
        at org.apache.avro.Schema$Parser.parse(Schema.java:1432)
        at org.apache.avro.Schema$Parser.parse(Schema.java:1418)
        at 
org.apache.pulsar.broker.service.schema.validator.StructSchemaDataValidator.validate(StructSchemaDataValidator.java:52)
        ... 71 more
    Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized 
token 'syntax': was expecting (JSON String, Number, Array, Object or token 
'null', 'true' or 'false')
     at [Source: (String)"syntax = "proto3";
    
    package com.mycorp.mynamespace;
    
    import 'google/protobuf/any.proto';
    
    message SampleRecord {
    
     int32 my_field1 = 1;
     double my_field2 = 2;
     string my_field3 = 3;
    }"; line: 1, column: 7]
        at 
com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2337)
        at 
com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:720)
        at 
com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2903)
        at 
com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1949)
        at 
com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:781)
        at 
com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:2902)
        at org.apache.avro.Schema$Parser.parse(Schema.java:1430)
        ... 73 more
    
    ```
    
    (cherry picked from commit f9057c7b581384158aa0927b2c9a08cbafefc4a0)
---
 .../pulsar/broker/admin/impl/SchemasResourceBase.java      | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java
index 2a857c4..0899b92 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/SchemasResourceBase.java
@@ -126,7 +126,7 @@ public class SchemasResourceBase extends AdminResource {
                                 .build());
                     } else {
                         log.error("[{}] Failed to delete schema for topic {}", 
clientAppId(), topicName, error);
-                        response.resume(error);
+                        response.resume(new RestException(error));
                     }
                     return null;
                 });
@@ -166,7 +166,7 @@ public class SchemasResourceBase extends AdminResource {
                                     error.getMessage()).build());
                         } else {
                             log.error("[{}] Failed to post schema for topic 
{}", clientAppId(), topicName, error);
-                            response.resume(Response.serverError().build());
+                            response.resume(new RestException(error));
                         }
                         return null;
                     });
@@ -178,7 +178,7 @@ public class SchemasResourceBase extends AdminResource {
                         .build());
             } else {
                 log.error("[{}] Failed to post schema for topic {}", 
clientAppId(), topicName, error);
-                response.resume(Response.serverError().build());
+                response.resume(new RestException(error));
             }
             return null;
         });
@@ -209,7 +209,7 @@ public class SchemasResourceBase extends AdminResource {
                                 
.schemaCompatibilityStrategy(schemaCompatibilityStrategy.name()).build())
                         .build()))
                 .exceptionally(error -> {
-                    response.resume(Response.serverError().build());
+                    response.resume(new RestException(error));
                     return null;
                 });
     }
@@ -230,7 +230,7 @@ public class SchemasResourceBase extends AdminResource {
                         
.entity(LongSchemaVersionResponse.builder().version(version).build()).build()))
                 .exceptionally(error -> {
                     log.error("[{}] Failed to get version by schema for topic 
{}", clientAppId(), topicName, error);
-                    response.resume(Response.serverError().build());
+                    response.resume(new RestException(error));
                     return null;
                 });
     }
@@ -265,7 +265,7 @@ public class SchemasResourceBase extends AdminResource {
             }
         } else {
             log.error("Failed to get schema", error);
-            response.resume(error);
+            response.resume(new RestException(error));
         }
 
     }
@@ -286,7 +286,7 @@ public class SchemasResourceBase extends AdminResource {
             }
         } else {
             log.error("Failed to get all schemas", error);
-            response.resume(error);
+            response.resume(new RestException(error));
         }
     }
 

Reply via email to