Uploaded image for project: 'Jira Data Center'
  1. Jira Data Center
  2. JRASERVER-72530

Attachment thumbnails can affect Jira DC performance

XMLWordPrintable

    • 7.13
    • 16
    • Severity 2 - Major
    • 5
    • Hide

      Hey, All,

      Since we released a change in Jira 8.21.0, 8.20.4, and 8.13.16, the overall experience of working with attachment thumbnails was improved, but the initial problem is not yet completely resolved. As a result, we need to reopen this issue in order to track the progress of our work on developing a more comprehensive solution.

      We can’t provide an exact delivery date, but we'll update our messaging as soon as we know more.

      Regards,
      Octavian Genes
      Jira Dev team

      Show
      Hey, All, Since we released a change in Jira 8.21.0, 8.20.4, and 8.13.16 , the overall experience of working with attachment thumbnails was improved, but the initial problem is not yet completely resolved. As a result, we need to reopen this issue in order to track the progress of our work on developing a more comprehensive solution. We can’t provide an exact delivery date, but we'll update our messaging as soon as we know more. Regards, Octavian Genes Jira Dev team

      Issue Summary

      Issue operations (view, update) or any issue post-processing can trigger serialising the issue with all the issue properties, including all issue attachment properties. Attachment meta data is stored in DB except for thumbnails which properties are retrieved directly from the shared file system. 

      Steps to Reproduce

      1. Create issue with no attachment
      2. Viewing issue or updating issue operations performance is good (<<1sec)
      3. Add to issue 1000 attachments
      4. Viewing issue or updating issue operations performance is no acceptable (>>10sec)
        Each issue operation (view, update) can trigger 1000 x N calls to the shared file system.

      Expected Results

      Attachment thumbnails should not cause serious performance degradation on any issue operation. 

      Actual Results

      Many threads (both HTTP user threads or other threads) hangs on shared file operations:

      "http-nio-127.0.0.1-8080-exec-238 *** runnable 
         java.lang.Thread.State: RUNNABLE
              at java.io.UnixFileSystem.createFileExclusively(Native Method)
              at java.io.File.createTempFile(File.java:2061)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.getTempFile(DefaultThumbnailManager.java:273)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.doGetThumbnail(DefaultThumbnailManager.java:171)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.getThumbnail(DefaultThumbnailManager.java:129)
              at sun.reflect.GeneratedMethodAccessor2136.invoke(Unknown Source)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:498)
              at com.atlassian.jira.config.component.SwitchingInvocationHandler.invoke(SwitchingInvocationHandler.java:38)
              at com.sun.proxy.$Proxy40.getThumbnail(Unknown Source)
              at com.atlassian.jira.issue.fields.rest.json.beans.AttachmentJsonBeanConverterImpl.shortBean(AttachmentJsonBeanConverterImpl.java:67)
              at com.atlassian.jira.issue.fields.rest.json.beans.AttachmentJsonBeanConverterImpl.shortBeans(AttachmentJsonBeanConverterImpl.java:42)
              at com.atlassian.jira.issue.fields.AttachmentSystemField.getJsonFromIssue(AttachmentSystemField.java:319)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder2.getRepresentationForFields(IssueBeanBuilder2.java:241)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder2.lambda$createFieldsDataFromOrderable$3(IssueBeanBuilder2.java:228)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder2$$Lambda$4982/881915241.apply(Unknown Source)
              at io.atlassian.fugue.Iterables$CollectingIterable$Iter.computeNext(Iterables.java:604)
              at io.atlassian.fugue.Iterators$Abstract.tryToComputeNext(Iterators.java:284)
              at io.atlassian.fugue.Iterators$Abstract.hasNext(Iterators.java:278)
              at com.google.common.collect.TransformedIterator.hasNext(TransformedIterator.java:42)
              at com.google.common.collect.Iterators.addAll(Iterators.java:357)
              at com.google.common.collect.Sets.newHashSet(Sets.java:276)
              at com.google.common.collect.Sets.newHashSet(Sets.java:259)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder2.createFieldsData(IssueBeanBuilder2.java:198)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder2.build(IssueBeanBuilder2.java:143)
              at com.atlassian.jira.rest.v2.issue.IssueBeanBuilder.build(IssueBeanBuilder.java:63)
              at com.atlassian.jira.plugins.webhooks.serializer.IssueBeanFactory.createBean(IssueBeanFactory.java:37)
              at com.atlassian.jira.plugins.webhooks.serializer.IssueEventSerializer.putFields(IssueEventSerializer.java:61)
              at com.atlassian.jira.plugins.webhooks.serializer.IssueEventSerializer.putFields(IssueEventSerializer.java:28)
              at com.atlassian.jira.plugins.webhooks.serializer.AbstractJiraEventSerializer.serialize(AbstractJiraEventSerializer.java:28)
              at com.atlassian.webhooks.plugin.module.WebHookEventSerializer.serialize(WebHookEventSerializer.java:32)
              at com.atlassian.webhooks.plugin.PublishTaskFactoryImpl.getEventBody(PublishTaskFactoryImpl.java:67)
              at com.atlassian.webhooks.plugin.PublishTaskFactoryImpl.getPublishTask(PublishTaskFactoryImpl.java:61)
      
      "http-nio-127.0.0.1-8080-exec-230 *** runnable 
         java.lang.Thread.State: RUNNABLE
              at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
              at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
              at java.io.File.exists(File.java:828)
              at java.io.File.mkdirs(File.java:1377)
              at com.atlassian.jira.issue.attachment.FileSystemAttachmentDirectoryAccessor.getAttachmentDirectory(FileSystemAttachmentDirectoryAccessor.java:103)
              at com.atlassian.jira.issue.attachment.FileSystemAttachmentDirectoryAccessor.getThumbnailDirectory(FileSystemAttachmentDirectoryAccessor.java:60)
              at com.atlassian.jira.issue.attachment.FileSystemAttachmentDirectoryAccessor.getThumbnailDirectory(FileSystemAttachmentDirectoryAccessor.java:48)
              at com.atlassian.jira.issue.attachment.FileSystemThumbnailAccessor.getThumbnailFile(FileSystemThumbnailAccessor.java:45)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.getThumbnailFile(DefaultThumbnailManager.java:198)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.doGetThumbnail(DefaultThumbnailManager.java:160)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.getThumbnail(DefaultThumbnailManager.java:129)
              at com.atlassian.jira.issue.thumbnail.DefaultThumbnailManager.getThumbnail(DefaultThumbnailManager.java:121)
              at sun.reflect.GeneratedMethodAccessor2950.invoke(Unknown Source)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:498)
              at com.atlassian.jira.config.component.SwitchingInvocationHandler.invoke(SwitchingInvocationHandler.java:38)
              at com.sun.proxy.$Proxy40.getThumbnail(Unknown Source)
              at com.atlassian.jira.issue.fields.renderer.wiki.embedded.RendererAttachmentManager.getThumbnail(RendererAttachmentManager.java:73)
              at com.atlassian.renderer.embedded.EmbeddedImageRenderer.getThumbnail(EmbeddedImageRenderer.java:147)
              at com.atlassian.renderer.embedded.EmbeddedImageRenderer.generateThumbnail(EmbeddedImageRenderer.java:158)
              at com.atlassian.renderer.embedded.EmbeddedImageRenderer.renderResource(EmbeddedImageRenderer.java:99)
              at com.atlassian.jira.issue.fields.renderer.wiki.embedded.JiraEmbeddedImageRenderer.renderResource(JiraEmbeddedImageRenderer.java:37)
              at com.atlassian.renderer.embedded.DefaultEmbeddedResourceRenderer.renderResource(DefaultEmbeddedResourceRenderer.java:57)
              at com.atlassian.jira.issue.fields.renderer.wiki.embedded.JiraEmbeddedResourceRenderer.renderResource(JiraEmbeddedResourceRenderer.java:37)
              at com.atlassian.renderer.v2.components.AbstractEmbeddedRendererComponent.appendSubstitution(AbstractEmbeddedRendererComponent.java:39)
              at com.atlassian.renderer.v2.components.AbstractNoTokenRegexRendererComponent.appendNoTokenSubstitution(AbstractNoTokenRegexRendererComponent.java:51)
              at com.atlassian.renderer.v2.components.AbstractNoTokenRegexRendererComponent.regexRender(AbstractNoTokenRegexRendererComponent.java:34)
              at com.atlassian.renderer.v2.components.AbstractEmbeddedRendererComponent.render(AbstractEmbeddedRendererComponent.java:20)
              at com.atlassian.renderer.v2.V2Renderer.render(V2Renderer.java:45)
              at com.atlassian.renderer.v2.V2SubRenderer.render(V2SubRenderer.java:36)
              at com.atlassian.renderer.v2.components.block.BlockRendererComponent.renderParagraph(BlockRendererComponent.java:196)
              at com.atlassian.renderer.v2.components.block.BlockRendererComponent.flushParagraph(BlockRendererComponent.java:191)
              at com.atlassian.renderer.v2.components.block.BlockRendererComponent.render(BlockRendererComponent.java:114)
              at com.atlassian.renderer.v2.V2Renderer.render(V2Renderer.java:45)
              at com.atlassian.renderer.v2.V2SubRenderer.render(V2SubRenderer.java:36)
              at com.atlassian.renderer.v2.components.list.ListItem.toHtml(ListItem.java:28)
              at com.atlassian.renderer.v2.components.list.WikiList.toHtml(WikiList.java:42)
              at com.atlassian.renderer.v2.components.list.ListItem.appendChildren(ListItem.java:42)
              at com.atlassian.renderer.v2.components.list.ListRenderable.toHtml(ListRenderable.java:16)
              at com.atlassian.renderer.v2.components.list.ListBlockRenderer.renderNextBlock(ListBlockRenderer.java:71)
              at com.atlassian.renderer.v2.components.block.BlockRendererComponent.applyBlockRenderers(BlockRendererComponent.java:142)
              at com.atlassian.renderer.v2.components.block.BlockRendererComponent.render(BlockRendererComponent.java:90)
              at com.atlassian.renderer.v2.V2Renderer.render(V2Renderer.java:45)
              at com.atlassian.renderer.v2.TokenEscapingV2Renderer.render(TokenEscapingV2Renderer.java:28)
              at com.atlassian.renderer.v2.V2RendererFacade.convertWikiToXHtml(V2RendererFacade.java:83)
              at com.atlassian.jira.issue.fields.renderer.wiki.AtlassianWikiRenderer.render(AtlassianWikiRenderer.java:58)
              at com.atlassian.jira.issue.util.RendererWebPanelRenderUtil.<init>(RendererWebPanelRenderUtil.java:72)
              at com.atlassian.jira.plugin.renderer.JiraRendererModuleDescriptorImpl.getEditVM(JiraRendererModuleDescriptorImpl.java:120)
              at sun.reflect.GeneratedMethodAccessor1495.invoke(Unknown Source)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:498)
      

      Workaround

      Turn off thumbnails for attachments: https://confluence.atlassian.com/adminjiraserver/configuring-file-attachments-938847851.html

              Unassigned Unassigned
              mswinarski Maciej Swinarski (Inactive)
              Votes:
              6 Vote for this issue
              Watchers:
              12 Start watching this issue

                Created:
                Updated: