Confluence fails to load attachments when using S3 object storage

XMLWordPrintable

    • 4
    • Severity 2 - Major
    • 11

      Issue Summary

      Upgrading a Confluence instance which uses S3 object storage to version 9.2.0 results in users being unable to view, download, or upload attachments.

      Steps to Reproduce

      Upgrade a Confluence instance using S3 object storage to 9.2.0

      Expected Results

      Attachments stored in S3 continue to be accessible following an upgrade to 9.2.0

      Actual Results

      Attachments stored in S3 continue are not accessible following an upgrade to 9.2.0
      The below ClassNotFoundException exception is thrown in the* atlassian-confluence.log* file pointing towards an issue with the awssdk 

      2025-01-09 17:31:23,136 ERROR [Catalina-utility-2] [atlassian.confluence.event.ConfluenceListenerInvoker] log java.lang.RuntimeException occurred dispatching com.atlassian.confluence.event.events.plugin.PluginFrameworkStartedEvent to [com.atlassian.confluence.impl.health.PluginFrameworkStartedHealthCheckListener]
      java.lang.RuntimeException: software/amazon/awssdk/protocols/query/interceptor/QueryParametersToBodyInterceptor. Listener: com.atlassian.confluence.impl.health.PluginFrameworkStartedHealthCheckListener event: com.atlassian.confluence.event.events.plugin.PluginFrameworkStartedEvent
      	at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:53)
      	at com.atlassian.confluence.event.DelegatingListenerInvoker.invoke(DelegatingListenerInvoker.java:23)
      	at com.atlassian.confluence.event.ConfluenceListenerInvoker.invoke(ConfluenceListenerInvoker.java:30)
      	at com.atlassian.event.internal.ComparableListenerInvoker.invoke(ComparableListenerInvoker.java:48)
      	at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.lambda$static$0(AsynchronousAbleEventDispatcher.java:37)
      	at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.dispatch(AsynchronousAbleEventDispatcher.java:85)
      	at com.atlassian.event.internal.EventPublisherImpl.publish(EventPublisherImpl.java:102)
      	at com.atlassian.confluence.event.TimingEventPublisher.publish(TimingEventPublisher.java:75)
      	at com.atlassian.confluence.plugin.ConfluencePluginManager.lateStartup(ConfluencePluginManager.java:160)
      	at com.atlassian.confluence.plugin.PluginFrameworkContextListener.contextInitialized(PluginFrameworkContextListener.java:85)
      	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4016)
      	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4460)
      	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
      	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
      	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
      	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
      	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
      	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
      	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
      	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
      	at java.base/java.lang.Thread.run(Thread.java:1583)
      Caused by: java.lang.NoClassDefFoundError: software/amazon/awssdk/protocols/query/interceptor/QueryParametersToBodyInterceptor
      	at software.amazon.awssdk.services.sts.DefaultStsBaseClientBuilder.finalizeServiceConfiguration(DefaultStsBaseClientBuilder.java:73)
      	at software.amazon.awssdk.awscore.client.builder.AwsDefaultClientBuilder.finalizeChildConfiguration(AwsDefaultClientBuilder.java:167)
      	at software.amazon.awssdk.core.client.builder.SdkDefaultClientBuilder.syncClientConfiguration(SdkDefaultClientBuilder.java:197)
      	at software.amazon.awssdk.services.sts.DefaultStsClientBuilder.buildClient(DefaultStsClientBuilder.java:37)
      	at software.amazon.awssdk.services.sts.DefaultStsClientBuilder.buildClient(DefaultStsClientBuilder.java:26)
      	at software.amazon.awssdk.core.client.builder.SdkDefaultClientBuilder.build(SdkDefaultClientBuilder.java:164)
      	at software.amazon.awssdk.services.sts.internal.StsWebIdentityCredentialsProviderFactory$StsWebIdentityCredentialsProvider.<init>(StsWebIdentityCredentialsProviderFactory.java:71)
      	at software.amazon.awssdk.services.sts.internal.StsWebIdentityCredentialsProviderFactory$StsWebIdentityCredentialsProvider.<init>(StsWebIdentityCredentialsProviderFactory.java:55)
      	at software.amazon.awssdk.services.sts.internal.StsWebIdentityCredentialsProviderFactory.create(StsWebIdentityCredentialsProviderFactory.java:47)
      	at software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider.<init>(WebIdentityTokenFileCredentialsProvider.java:113)
      	at software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider.<init>(WebIdentityTokenFileCredentialsProvider.java:50)
      	at software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider$BuilderImpl.build(WebIdentityTokenFileCredentialsProvider.java:313)
      	at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.lambda$createChain$0(DefaultCredentialsProvider.java:98)
      	at software.amazon.awssdk.utils.Lazy.getValue(Lazy.java:50)
      	at software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider.resolveCredentials(LazyAwsCredentialsProvider.java:45)
      	at software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider.resolveCredentials(DefaultCredentialsProvider.java:129)
      	at software.amazon.awssdk.auth.credentials.AwsCredentialsProvider.resolveIdentity(AwsCredentialsProvider.java:54)
      	at software.amazon.awssdk.services.s3.auth.scheme.internal.S3AuthSchemeInterceptor.lambda$trySelectAuthScheme$4(S3AuthSchemeInterceptor.java:163)
      	at software.amazon.awssdk.core.internal.util.MetricUtils.reportDuration(MetricUtils.java:77)
      	at software.amazon.awssdk.services.s3.auth.scheme.internal.S3AuthSchemeInterceptor.trySelectAuthScheme(S3AuthSchemeInterceptor.java:163)
      	at software.amazon.awssdk.services.s3.auth.scheme.internal.S3AuthSchemeInterceptor.selectAuthScheme(S3AuthSchemeInterceptor.java:84)
      	at software.amazon.awssdk.services.s3.auth.scheme.internal.S3AuthSchemeInterceptor.beforeExecution(S3AuthSchemeInterceptor.java:64)
      	at software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain.lambda$beforeExecution$1(ExecutionInterceptorChain.java:59)
      	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
      	at software.amazon.awssdk.core.interceptor.ExecutionInterceptorChain.beforeExecution(ExecutionInterceptorChain.java:59)
      	at software.amazon.awssdk.awscore.internal.AwsExecutionContextBuilder.runInitialInterceptors(AwsExecutionContextBuilder.java:242)
      	at software.amazon.awssdk.awscore.internal.AwsExecutionContextBuilder.invokeInterceptorsAndCreateExecutionContext(AwsExecutionContextBuilder.java:132)
      	at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.invokeInterceptorsAndCreateExecutionContext(AwsSyncClientHandler.java:67)
      	at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.lambda$execute$1(BaseSyncClientHandler.java:76)
      	at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.measureApiCallSuccess(BaseSyncClientHandler.java:182)
      	at software.amazon.awssdk.core.internal.handler.BaseSyncClientHandler.execute(BaseSyncClientHandler.java:74)
      	at software.amazon.awssdk.core.client.handler.SdkSyncClientHandler.execute(SdkSyncClientHandler.java:45)
      	at software.amazon.awssdk.awscore.client.handler.AwsSyncClientHandler.execute(AwsSyncClientHandler.java:53)
      	at software.amazon.awssdk.services.s3.DefaultS3Client.putObject(DefaultS3Client.java:10294)
      	at software.amazon.awssdk.services.s3.S3Client.putObject(S3Client.java:19851)
      	at software.amazon.awssdk.services.s3.S3Client.putObject(S3Client.java:20037)
      	at com.atlassian.dc.filestore.impl.s3.S3Path.lambda$put$15(S3Path.java:141)
      	at com.atlassian.dc.filestore.impl.s3.OperationExecutorImpl.performOperation(OperationExecutorImpl.java:31)
      	at com.atlassian.dc.filestore.impl.s3.S3Path.put(S3Path.java:141)
      	at com.atlassian.dc.filestore.api.FileStore$Writer.write(FileStore.java:296)
      	at com.atlassian.confluence.impl.pages.attachments.AttachmentStorageChecker.testWrite(AttachmentStorageChecker.java:41)
      	at com.atlassian.confluence.impl.pages.attachments.AttachmentStorageChecker.testOperations(AttachmentStorageChecker.java:32)
      	at com.atlassian.confluence.impl.health.checks.AttachmentDataFileStoreCheck.checkConnectivity(AttachmentDataFileStoreCheck.java:136)
      	at com.atlassian.confluence.impl.health.checks.AttachmentDataFileStoreCheck.doPerform(AttachmentDataFileStoreCheck.java:105)
      	at com.atlassian.confluence.impl.health.HealthCheckTemplate.perform(HealthCheckTemplate.java:24)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckExecutor.runCheck(DefaultHealthCheckExecutor.java:84)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckExecutor.lambda$applyAndCollectExceptions$1(DefaultHealthCheckExecutor.java:63)
      	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
      	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
      	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
      	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
      	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckExecutor.applyAndCollectExceptions(DefaultHealthCheckExecutor.java:63)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckExecutor.performHealthChecks(DefaultHealthCheckExecutor.java:51)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckRunner.executeChecksAndRecordResults(DefaultHealthCheckRunner.java:106)
      	at com.atlassian.confluence.impl.health.DefaultHealthCheckRunner.runHealthChecks(DefaultHealthCheckRunner.java:74)
      	at com.atlassian.confluence.impl.health.PluginFrameworkStartedHealthCheckListener.onPluginFrameworkStartedEvent(PluginFrameworkStartedHealthCheckListener.java:40)
      	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
      	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
      	at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:42)
      	... 20 more
      Caused by: java.lang.ClassNotFoundException: software.amazon.awssdk.protocols.query.interceptor.QueryParametersToBodyInterceptor
      	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1339)
      	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1148)
      	... 85 more
      

      Additionally, the following response can be observed when attempting to add an attachment:

      {
      
         "message": "software/amazon/awssdk/protocols/query/interceptor/QueryParametersToBodyInterceptor",
      
         "status-code": 500,
      
         "stack-trace": "Please contact your admin passing attached Log's referral number: 6f925e7f-3114-49ec-b321-9e3de2a5496e"
      
      }
      

      Workaround

      Currently there is no known workaround for this behavior. A workaround will be added here when available

            Assignee:
            Kusal Kithul-Godage
            Reporter:
            Lou Paglaiccetti
            Votes:
            2 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: