Uploaded image for project: 'Bitbucket Data Center'
  1. Bitbucket Data Center
  2. BSERV-8985

Pull request activity enriching fails for searchActivities if a reply has been edited

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Low
    • None
    • 4.6.2
    • API - Java, Pull Requests
    • None

    Description

      Reproduced on 4.6.2 tag commit.

      If a PR comment reply is edited, and DefaultPullRequestService#searchActivities is called without filtering the activities, an exception is thrown when attempting to enrich them:

      2016-06-06 15:23:30,755 ERROR [http-nio-7990-exec-8] @1OKPYXRx923x153x0 1k4rz0u 0:0:0:0:0:0:0:1 "GET /mvc/error500 HTTP/1.1" c.a.s.i.web.ErrorPageController There was an unhandled exception loading [/bitbucket/plugins/servlet/notification/debug/projects/STASH/repos/stash/pull-requests/1]
      java.lang.IllegalArgumentException: Multiple entries with same key: repositoryId=1 and repositoryId=1
              at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:150) ~[guava-18.0.jar:na]
              at com.google.common.collect.RegularImmutableMap.checkNoConflictInBucket(RegularImmutableMap.java:104) ~[guava-18.0.jar:na]
              at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:70) ~[guava-18.0.jar:na]
              at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:254) ~[guava-18.0.jar:na]
              at com.atlassian.bitbucket.property.PropertyMap$Builder.build(PropertyMap.java:161) ~[bitbucket-api-4.6.2.jar:na]
              at com.atlassian.stash.internal.content.AbstractProviderContext.getPropertiesFor(AbstractProviderContext.java:35) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.comment.PluginCommentPostProcessor$Enricher.apply(PluginCommentPostProcessor.java:135) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.comment.PluginCommentPostProcessor$Enricher.apply(PluginCommentPostProcessor.java:127) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.comment.PluginCommentPostProcessor$Enricher.apply(PluginCommentPostProcessor.java:118) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.google.common.collect.Iterators$8.transform(Iterators.java:799) ~[guava-18.0.jar:na]
              at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48) ~[guava-18.0.jar:na]
              at com.google.common.collect.ImmutableSet.copyOf(ImmutableSet.java:317) ~[guava-18.0.jar:na]
              at com.google.common.collect.ImmutableSet.copyOf(ImmutableSet.java:300) ~[guava-18.0.jar:na]
              at com.atlassian.stash.internal.comment.PluginCommentPostProcessor.processAll(PluginCommentPostProcessor.java:70) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.pull.comment.CompositeCommentPostProcessor.processAll(CompositeCommentPostProcessor.java:51) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.pull.comment.CommentPullRequestActivityEnricher.enrich(CommentPullRequestActivityEnricher.java:93) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.pull.DefaultPullRequestService.enrichActivities(DefaultPullRequestService.java:1186) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.pull.DefaultPullRequestService.enrichActivities(DefaultPullRequestService.java:1179) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.pull.DefaultPullRequestService.searchActivities(DefaultPullRequestService.java:762) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26) ~[atlassian-plugins-core-4.1.8.jar:na]
              at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) ~[na:na]
              at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) ~[na:na]
              at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70) ~[na:na]
              at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53) ~[na:na]
              at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) ~[na:na]
              at com.atlassian.stash.internal.notification.web.NotificationRendererDebugServlet.getPullRequestActivities(NotificationRendererDebugServlet.java:120) ~[na:na]
              at com.atlassian.stash.internal.notification.web.NotificationRendererDebugServlet.doGet(NotificationRendererDebugServlet.java:85) ~[na:na]
              at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) ~[na:na]
              at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) ~[na:na]
              at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) ~[na:na]
              at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) ~[na:na]
              at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:24) ~[na:na]
              at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:181) ~[sitemesh-2.5-atlassian-11.jar:na]
              at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:85) ~[sitemesh-2.5-atlassian-11.jar:na]
              at com.atlassian.plugin.connect.plugin.auth.scope.ApiScopingFilter.doFilter(ApiScopingFilter.java:81) ~[na:na]
              at com.atlassian.stash.internal.spring.security.StashAuthenticationFilter.doFilter(StashAuthenticationFilter.java:88) ~[classes/:na]
              at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doInsideSpringSecurityChain(BeforeLoginPluginAuthenticationFilter.java:109) ~[classes/:na]
              at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:75) ~[classes/:na]
              at com.atlassian.security.auth.trustedapps.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:94) ~[atlassian-trusted-apps-core-4.2.0.jar:na]
              at com.atlassian.oauth.serviceprovider.internal.servlet.OAuthFilter.doFilter(OAuthFilter.java:67) ~[na:na]
              at com.atlassian.core.filters.ServletContextThreadLocalFilter.doFilter(ServletContextThreadLocalFilter.java:21) ~[atlassian-core-4.6.19.jar:na]
              at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) ~[atlassian-core-4.6.19.jar:na]
              at com.atlassian.plugin.connect.plugin.auth.user.ThreeLeggedAuthFilter.doFilter(ThreeLeggedAuthFilter.java:109) ~[na:na]
              at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:32) ~[na:na]
              at com.atlassian.analytics.client.filter.DefaultAnalyticsFilter.doFilter(DefaultAnalyticsFilter.java:38) ~[na:na]
              at com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:39) ~[na:na]
              at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doBeforeBeforeLoginFilters(BeforeLoginPluginAuthenticationFilter.java:87) ~[classes/:na]
              at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:73) ~[classes/:na]
              at com.atlassian.stash.internal.request.DefaultRequestManager.doAsRequest(DefaultRequestManager.java:86) ~[bitbucket-service-impl-4.6.2.jar:na]
              at com.atlassian.stash.internal.hazelcast.ConfigurableWebFilter.doFilter(ConfigurableWebFilter.java:38) ~[classes/:na]
              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_45]
              at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]
              ... 283 frames trimmed
      

      This happens because the same comment activity is enriched twice. Three activity items are retrieved:

      • Root comment added (Comment X)
      • Reply added (Comment Y)
      • Reply edited (Comment Y)

      The comments are added to a Set in CommentPullRequestActivityEnricher#enrich which filters it out to root comment (X) and reply (Y). However the enriching logic creates a CommentChain which implements DepthFirstIterator. This iterator will iterate through all the comments and their replies in reverse order, meaning: reply comment Y (no replies), root comment X -> reply comment Y.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              jpalacios Juan Palacios (Inactive)
              Votes:
              3 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:

                Backbone Issue Sync