Details
-
Bug
-
Resolution: Fixed
-
Low
-
6.4
-
6.04
-
Severity 2 - Major
-
Description
Summary
JQL function componentsLeadByUser() takes time proportional to number of projects cubed.
Expected behaviour
componentsLeadByUser() should be executed fast even on instances with large number of projects.
Current behaviour
JQL queries that use componentsLeadByUser() can take tens of seconds on instances with ~1000 projects and minutes on larger instances.
Verification steps
To confirm that your JIRA instance experiences this problem you can take thread dump during execution of JQL that uses componentsLeadByUser() function (com.atlassian.jira.plugin.jql.function.ComponentsLeadByUserFunction.getFunctionValuesList) and look for thread that has stack trace similar to the following one (note: there can be easily hundreds of lines with invocations of next/hasNext methods):
"http-nio-80-exec-125" #126716 daemon prio=5 os_prio=0 tid=0x0000000055262000 nid=0x1eac runnable [0x0000000079d52000] java.lang.Thread.State: RUNNABLE at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.hasNext(Iterators.java:547) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.google.common.collect.Iterators$5.next(Iterators.java:558) at com.atlassian.jira.plugin.jql.function.ComponentsLeadByUserFunction.getFunctionValuesList(ComponentsLeadByUserFunction.java:70) at com.atlassian.jira.plugin.jql.function.AbstractUserBasedFunction.getValues(AbstractUserBasedFunction.java:79) at com.atlassian.jira.jql.operand.FunctionOperandHandler$3.call(FunctionOperandHandler.java:61) at com.atlassian.jira.jql.operand.FunctionOperandHandler$3.call(FunctionOperandHandler.java:58) at com.atlassian.ozymandias.SafePluginPointAccess.call(SafePluginPointAccess.java:187) at com.atlassian.jira.jql.operand.FunctionOperandHandler.getValues(FunctionOperandHandler.java:58) at com.atlassian.jira.jql.operand.FunctionOperandHandler.getValues(FunctionOperandHandler.java:26) at com.atlassian.jira.jql.operand.DefaultJqlOperandResolver.getValues(DefaultJqlOperandResolver.java:87) at com.atlassian.jira.jql.operand.DefaultJqlOperandResolver.getValues(DefaultJqlOperandResolver.java:68) at com.atlassian.jira.jql.context.MultiClauseDecoratorContextFactory.getClauseContext(MultiClauseDecoratorContextFactory.java:58) at com.atlassian.jira.jql.context.ValidatingDecoratorContextFactory.getClauseContext(ValidatingDecoratorContextFactory.java:29) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:121) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.TerminalClauseImpl.accept(TerminalClauseImpl.java:143) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:75) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:28) at com.atlassian.jira.jql.context.QueryContextVisitor.createContext(QueryContextVisitor.java:54) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:69) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:28) at com.atlassian.jira.bc.issue.search.DefaultSearchService.getQueryContext(DefaultSearchService.java:204) at sun.reflect.GeneratedMethodAccessor742.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26) at com.sun.proxy.$Proxy294.getQueryContext(Unknown Source) at sun.reflect.GeneratedMethodAccessor742.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.atlassian.plugin.osgi.bridge.external.HostComponentFactoryBean$DynamicServiceInvocationHandler.invoke(HostComponentFactoryBean.java:136) at com.sun.proxy.$Proxy294.getQueryContext(Unknown Source) at com.atlassian.greenhopper.service.query.QueryToProjectMapper.getProjectContextIdsForQuery(QueryToProjectMapper.java:90) at com.atlassian.greenhopper.service.query.QueryServiceImpl.getProjectsForRapidViewFilterQuery(QueryServiceImpl.java:103) at com.atlassian.greenhopper.web.rapid.view.RapidViewProjectHelper.getRapidViewProjectList(RapidViewProjectHelper.java:42) at com.atlassian.greenhopper.web.rapid.view.RapidViewFilterHelper.buildSavedFilterEntry(RapidViewFilterHelper.java:281) at com.atlassian.greenhopper.web.rapid.view.RapidViewListHelper.buildListEntry(RapidViewListHelper.java:215) at com.atlassian.greenhopper.web.rapid.view.RapidViewListHelper.buildListModel(RapidViewListHelper.java:156) ...
Workaround
None