Uploaded image for project: 'Bamboo Data Center'
  1. Bamboo Data Center
  2. BAM-21562

Cloning a job is very slow for non admin users

    XMLWordPrintable

Details

    Description

      Issue Summary

      The Add a new job > Clone an existing job window is very slow to open for non admin users. Times ranging from 13s to 1m20s were observed when trying to open that window.

      Steps to Reproduce

      • Bamboo 8.1.1
      • PostgreSQL 9.6
      • Plans
        • # of plans (CHAIN and CHAIN_BRANCH): 12.229
        • # of jobs - this is the number that shows up inside the application.xml for <number-of-plans>: 24.457
      • Permissions
        • # of rows inside the acl_entry table: 809.313
      1. Access Bamboo as a non admin user from a web browser (e.g. Google Chrome).
      2. Access the Plan configuration page from one of the plans.
      3. Click the 'Add job > Clone an existing job' button under one of your stages.

      Expected Results

      The Clone job window loads up quickly.

      Actual Results

      The Clone job window takes several seconds to load. This is related to the fact that Bamboo has to check permissions and see what plans you have permissions to clone jobs. The permission check is what's taking time. The more permissions need to be validated the more time Bamboo takes to load that window for a regular user – similarly to what happens in (BAM-20604) Build dashboard page slow for non admin users.

      This is where Bamboo seems to be spending the most time while the window is loading:

      "http-nio-8085-exec-26360" #18773998 daemon prio=5 os_prio=0 tid=0x00007fb978174800 nid=0x69fa runnable [0x00007fb7fdabe000]
         java.lang.Thread.State: RUNNABLE
      	at java.util.ArrayList.remove(ArrayList.java:532)
      	at org.acegisecurity.afterinvocation.CollectionFilterer.getFilteredObject(CollectionFilterer.java:76)
      	at org.acegisecurity.afterinvocation.AclEntryAfterInvocationCollectionFilteringProvider.decide(AclEntryAfterInvocationCollectionFilteringProvider.java:127)
      	at org.acegisecurity.afterinvocation.AfterInvocationProviderManager.decide(AfterInvocationProviderManager.java:74)
      	at org.acegisecurity.intercept.AbstractSecurityInterceptor.afterInvocation(AbstractSecurityInterceptor.java:179)
      	at org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:68)
      	at com.atlassian.bamboo.security.acegi.intercept.aopalliance.AuthorityOverrideMethodSecurityInterceptor.invoke(AuthorityOverrideMethodSecurityInterceptor.java:28)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
      	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
      	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
      	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
      	at com.sun.proxy.$Proxy164.getPlansForClone(Unknown Source)
      	at com.atlassian.bamboo.ww2.actions.chains.CreateJob.getChainsToClone(CreateJob.java:214)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at ognl.OgnlRuntime.invokeMethodInsideSandbox(OgnlRuntime.java:1266)
      	at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:1251)
      	at ognl.OgnlRuntime.getMethodValue(OgnlRuntime.java:2153)
      	at ognl.ObjectPropertyAccessor.getPossibleProperty(ObjectPropertyAccessor.java:66)
      	at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:160)
      	at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.getProperty(ObjectAccessor.java:32)
      	at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3341)
      	at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.getProperty(CompoundRootAccessor.java:144)
      	at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3341)
      	at ognl.ASTProperty.getValueBody(ASTProperty.java:121)
      	at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
      	at ognl.SimpleNode.getValue(SimpleNode.java:258)
      	at ognl.Ognl.getValue(Ognl.java:537)
      	at ognl.Ognl.getValue(Ognl.java:501)
      	at com.opensymphony.xwork2.ognl.OgnlUtil$2.execute(OgnlUtil.java:484)
      	at com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecute(OgnlUtil.java:523)
      	at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:482)
      	at com.opensymphony.xwork2.ognl.OgnlValueStack.getValueUsingOgnl(OgnlValueStack.java:296)
      	at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:279)
      	at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:261)
      	at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:241)
      	at org.apache.struts2.components.Component.findValue(Component.java:275)
      	at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:72)
      	at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:101)
      	at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:925)
      	at org.apache.struts2.components.UIBean.end(UIBean.java:535)
      	at org.apache.struts2.views.freemarker.tags.CallbackWriter.afterBody(CallbackWriter.java:81)
      	at freemarker.core.Environment.visitAndTransform(Environment.java:461)
      	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:111)
      	at freemarker.core.Environment.visit(Environment.java:326)
      	at freemarker.core.Environment.visit(Environment.java:368)
      	at freemarker.core.Environment.invokeNestedContent(Environment.java:571)
      	at freemarker.core.BodyInstruction.accept(BodyInstruction.java:60)
      	at freemarker.core.Environment.visit(Environment.java:326)
      	at freemarker.core.Environment.visit(Environment.java:368)
      	at freemarker.core.Environment.invoke(Environment.java:714)
      	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:86)
      	at freemarker.core.Environment.visit(Environment.java:362)
      	at freemarker.core.Environment.visitAndTransform(Environment.java:460)
      	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:111)
      	at freemarker.core.Environment.visit(Environment.java:326)
      	at freemarker.core.Environment.visit(Environment.java:332)
      	at freemarker.core.Environment.process(Environment.java:305)
      	at freemarker.template.Template.process(Template.java:384)
              ...
      

      Workaround

      1. Use Bamboo Specs to manage your plans (this way you can easily clone/copy tasks from other plans into your Specs code).

      Attachments

        Issue Links

          Activity

            People

              mgardias Marcin Gardias
              brosa Bruno Rosa
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: