You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ozone.apache.org by "Duong (Jira)" <ji...@apache.org> on 2022/07/12 15:47:00 UTC

[jira] [Updated] (HDDS-6903) Correct mapping of exceptions to HTTP codes

     [ https://issues.apache.org/jira/browse/HDDS-6903?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Duong updated HDDS-6903:
------------------------
    Description: 
Today, the handling of user related exceptions, i.e. OMException, is inconsistent across endpoints. Sometimes, OMException are "manually" converted to OS3Exception, .e.g. [here|#L261-L261] or [here|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java#L654-L654], then correctly mapped to 4xx responses by [OS3ExceptionMapper|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java#L35-L35].

Yet occasionally, OS3Exceptions are left unhandled and by default resolved to 500 - Internal Server Errors. For instance:
{code:java}
sh-4.2$ aws s3api --endpoint http://localhost:9878 list-objects --bucket bucket_3
An error occurred (500) when calling the ListObjects operation (reached max retries: 4): Internal Server Error {code}
{code:java}
2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannel: handleException /bucket_3 INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannelState: unhandled due to prior sendErrorjavax.servlet.ServletException: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:162)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 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)at java.base/java.lang.Thread.run(Thread.java:829)Caused by: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:410)at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) {code}
We need to implement an exception mapper to convert all OMException to correct response codes.  ...

The complete mapping can be built based on the Exception/ResultCode and matching them with the [error codes from S3 API|https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList].

 

 

  was:
Today, handling of user related exceptions, i.e. OMException, is inconsistent across endpoints. Sometimes, OMException are "manually" converted to OS3Exception, .e.g. [here|#L261-L261] or [here|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java#L654-L654], then correctly mapped to 4xx responses by [OS3ExceptionMapper|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java#L35-L35].

Yet in many case, OS3Exception are left unhandled and by default resolved to 500 - Internal Server Errors. For instance:
{code:java}
sh-4.2$ aws s3api --endpoint http://localhost:9878 list-objects --bucket bucket_3
An error occurred (500) when calling the ListObjects operation (reached max retries: 4): Internal Server Error {code}
{code:java}
2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannel: handleException /bucket_3 INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannelState: unhandled due to prior sendErrorjavax.servlet.ServletException: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:162)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 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)at java.base/java.lang.Thread.run(Thread.java:829)Caused by: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:410)at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) {code}
We need to implement an exception mapper to convert all OMException to correct response codes.  ...

The complete mapping can be built based on the Exception/ResultCode and matching them with the [error codes from S3 API|https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList].

 

 


> Correct mapping of exceptions to HTTP codes 
> --------------------------------------------
>
>                 Key: HDDS-6903
>                 URL: https://issues.apache.org/jira/browse/HDDS-6903
>             Project: Apache Ozone
>          Issue Type: Improvement
>          Components: S3
>            Reporter: Duong
>            Priority: Major
>
> Today, the handling of user related exceptions, i.e. OMException, is inconsistent across endpoints. Sometimes, OMException are "manually" converted to OS3Exception, .e.g. [here|#L261-L261] or [here|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java#L654-L654], then correctly mapped to 4xx responses by [OS3ExceptionMapper|https://github.com/duongnguyen0/ozone/blob/master/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java#L35-L35].
> Yet occasionally, OS3Exceptions are left unhandled and by default resolved to 500 - Internal Server Errors. For instance:
> {code:java}
> sh-4.2$ aws s3api --endpoint http://localhost:9878 list-objects --bucket bucket_3
> An error occurred (500) when calling the ListObjects operation (reached max retries: 4): Internal Server Error {code}
> {code:java}
> 2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannel: handleException /bucket_3 INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _2022-06-17 02:33:19,466 [qtp1912821769-23] WARN server.HttpChannelState: unhandled due to prior sendErrorjavax.servlet.ServletException: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:162)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 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)at java.base/java.lang.Thread.run(Thread.java:829)Caused by: javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: INVALID_BUCKET_NAME org.apache.hadoop.ozone.om.exceptions.OMException: Bucket or Volume name has an unsupported character : _at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:410)at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) {code}
> We need to implement an exception mapper to convert all OMException to correct response codes.  ...
> The complete mapping can be built based on the Exception/ResultCode and matching them with the [error codes from S3 API|https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList].
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@ozone.apache.org
For additional commands, e-mail: issues-help@ozone.apache.org