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

Benoit Tellier closed JAMES-3800.
---------------------------------
    Fix Version/s: 3.8.0
       Resolution: Fixed

> Slightly improve S3 error management
> ------------------------------------
>
>                 Key: JAMES-3800
>                 URL: https://issues.apache.org/jira/browse/JAMES-3800
>             Project: James Server
>          Issue Type: Bug
>          Components: Blob
>    Affects Versions: 3.7.0
>            Reporter: Benoit Tellier
>            Priority: Major
>             Fix For: 3.8.0
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> On top of the OVH S3 blob store (whose quality is questionable at best) I 
> encounter S3 driver timeouts. These timeouts are catched at the Netty layer 
> and results in future cancelation which leads to empty publisher.
> {code:java}
> oftware.amazon.awssdk.services.s3.model.S3Exception: null (Service: S3, 
> Status Code: 400, Request ID: null)
>  at 
> software.amazon.awssdk.services.s3.model.S3Exception$BuilderImpl.build(S3Exception.java:95)
>   at 
> software.amazon.awssdk.services.s3.model.S3Exception$BuilderImpl.build(S3Exception.java:55)
>    at 
> software.amazon.awssdk.protocols.query.internal.unmarshall.AwsXmlErrorUnmarshaller.unmarshall(AwsXmlErrorUnmarshaller.java:99)
>     at 
> software.amazon.awssdk.protocols.query.unmarshall.AwsXmlErrorProtocolUnmarshaller.handle(AwsXmlErrorProtocolUnmarshaller.java:102)
>      at 
> software.amazon.awssdk.protocols.query.unmarshall.AwsXmlErrorProtocolUnmarshaller.handle(AwsXmlErrorProtocolUnmarshaller.java:82)
>       at 
> software.amazon.awssdk.core.http.MetricCollectingHttpResponseHandler.lambda$handle$0(MetricCollectingHttpResponseHandler.java:52)
>        at 
> software.amazon.awssdk.core.internal.util.MetricUtils.measureDurationUnsafe(MetricUtils.java:63)
>         at 
> software.amazon.awssdk.core.http.MetricCollectingHttpResponseHandler.handle(MetricCollectingHttpResponseHandler.java:52)
>          at 
> software.amazon.awssdk.core.internal.http.async.AsyncResponseHandler.lambda$prepare$0(AsyncResponseHandler.java:89)
>           at 
> java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(Unknown 
> Source)
>            at 
> java.base/java.util.concurrent.CompletableFuture.postComplete(Unknown Source)
>             at 
> java.base/java.util.concurrent.CompletableFuture.complete(Unknown Source)
>              at 
> software.amazon.awssdk.core.internal.http.async.AsyncResponseHandler$BaosSubscriber.onComplete(AsyncResponseHandler.java:132)
>               at 
> software.amazon.awssdk.http.nio.netty.internal.ResponseHandler$DataCountingPublisher$1.onComplete(ResponseHandler.java:513)
>                at 
> software.amazon.awssdk.http.nio.netty.internal.ResponseHandler.runAndLogError(ResponseHandler.java:250)
>                 at 
> software.amazon.awssdk.http.nio.netty.internal.ResponseHandler.access$600(ResponseHandler.java:75)
>                  at 
> software.amazon.awssdk.http.nio.netty.internal.ResponseHandler$PublisherAdapter$1.onComplete(ResponseHandler.java:371)
>                   at 
> software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerPublisher.complete(HandlerPublisher.java:447)
>                    at 
> software.amazon.awssdk.http.nio.netty.internal.nrs.HandlerPublisher.channelInactive(HandlerPublisher.java:430)
>                     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                      at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                       at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                        at 
> io.netty.handler.logging.LoggingHandler.channelInactive(LoggingHandler.java:206)
>                         at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                           at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                            at 
> io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81)
>                             at 
> io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277)
>                              at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                               at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                                at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                                 at 
> io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelInactive(CombinedChannelDuplexHandler.java:418)
>                                  at 
> io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:392)
>                                   at 
> io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:357)
>                                    at 
> io.netty.handler.codec.http.HttpClientCodec$Decoder.channelInactive(HttpClientCodec.java:326)
>                                     at 
> io.netty.channel.CombinedChannelDuplexHandler.channelInactive(CombinedChannelDuplexHandler.java:221)
>                                      at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                                       at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                                        at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                                         at 
> io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:392)
>                                          at 
> io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:357)
>                                           at 
> io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1074)
>                                            at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                                             at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                                              at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                                               at 
> io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81)
>                                                at 
> io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277)
>                                                 at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                                                  at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                                                   at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:241)
>                                                    at 
> io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405)
>                                                     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:262)
>                                                      at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:248)
>                                                       at 
> io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901)
>                                                        at 
> io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:813)
>                                                         at 
> io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
>                                                          at 
> io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
>                                                           at 
> io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
>                                                            at 
> io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
>                                                             at 
> io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
>                                                              at 
> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
>                                                               at 
> java.base/java.lang.Thread.run(Unknown Source) 
> {code}
> This empty publisher is then badly handled by follow up layers resulting in 
> invalid arguments errors that are hard to understand...
> {code:java}
> java.lang.IllegalArgumentException: null
>  at com.google.common.base.Preconditions.checkArgument(Preconditions.java:131)
>  at 
> org.apache.james.blob.mail.MimeMessageStore$MimeMessageDecoder.decode(MimeMessageStore.java:123)
>  at 
> org.apache.james.blob.mail.MimeMessageStore$MimeMessageDecoder.decode(MimeMessageStore.java:119)
>  at 
> reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:113)
>  at 
> reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816)
>  at 
> reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159)
> ...
> {code}
> We should better handle empty publishers in S3BlobStoreDAO, and convert empty 
> publisher into errors there, rather than impacting third party components.
> Also I will open a bug report about propagating the original error from the 
> netty stack to the end user. 



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

---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to