Scripted field causes Issue navigator slow loading - how to improve performance?

Jiri Vomacka July 3, 2014
I use Jira 6.1 with latest Script Runner, and I use (a quite simple) scripted field computing total time of linked issues (in Epic):
import com.atlassian.jira.ComponentManager
double totalTime = 0
def scripttime=System.currentTimeMillis()

if (issue.getIssueTypeId()=="21") { // Epic
  def componentManager = ComponentManager.getInstance()
  def issueLinkManager = componentManager.getIssueLinkManager()
  def time=0
  issueLinkManager.getOutwardLinks(issue.id)?.each {issueLink ->
    if (issueLink.issueLinkType.name == "Epic-Story Link") {
        time=issueLink.destinationObject.getTimeSpent();
        if (time!=null) totalTime += time/3600;        
        }
    }
  }     
scripttime = System.currentTimeMillis()-scripttime;
log.warn ("ScriptField Epic time summary took [ms] "+scripttime)
return totalTime

It works well on issue detail, but when I use this field in Issue navigator, JIRA whows the results extremely slowly.
The script itself takes only several milliseconds (from 1 to 10), but the Jira profiler says that each item takes between 150 and 500 milliseconds. Result: issue navigator with this field displayed and JQL query with 100 items takes
approx. 25 seconds to load and display.

JIRA evaluates the custom field for each issue in the navigator - is there some overhead in Jira, while calling and executing groovy script?

I would expected that Jira takes the values from Lucene index...
Custom field has "Number searcher" assigned.


Please, could you help me with this problem?


4 answers

0 votes
Tolga Guc December 2, 2015

We have the same case. If we do not include the scripted field as a result column, a sample search returning 268 issues takes 10 secs otherwise around 90 secs. When we enabled the JIRA profile, it shows that for every record, it takes almost 900 ms. in the "IssueTableHtml" step. (Our version of JIRA is 6.3.15)

 

JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
December 2, 2015

You need to make sure you have set a searcher for the field, otherwise it will be recalculated for every issue (in order to show the value)...

Tolga Guc December 2, 2015

Thank you for your answer. Users requested a field to get and search "due date change count for an issue." Searcher is "Number Searcher" and Template is "Number Field" The code (I know, far from optimum) is as belows: import com.atlassian.jira.ComponentManager import com.atlassian.jira.issue.history.ChangeItemBean def componentManager = ComponentManager.getInstance() def changeHistoryManager = componentManager.getChangeHistoryManager() List<ChangeItemBean> issueDuaDateChangedManager = changeHistoryManager.getChangeItemsForField(issue, "DueDate") def duadateChangeMinItem = 0 def duadateChangeCount = 0 for (entry in issueDuaDateChangedManager){ if(duadateChangeMinItem == 0){ duadateChangeMinItem = entry.getCreated().getTime() duadateChangeMinItemValue = entry.getFromString() } else{ if (entry.getCreated().getTime() < duadateChangeMinItem) { duadateChangeMinItem = entry.getCreated().getTime() duadateChangeMinItemValue = entry.getFromString() } } if(duadateChangeMinItemValue){ duadateChangeCount = issueDuaDateChangedManager.size() } else { if (issueDuaDateChangedManager.size() > 0) { duadateChangeCount = issueDuaDateChangedManager.size() - 1 } } } duadateChangeCount as Double

JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
December 3, 2015

I don't see a real problem in the script... I think there is another issue though. Why does the search without the field take so long to render? 10s is far too much. Can you look for the diagnostic info in the html at the bottom of the page...

Jakub Marek March 29, 2016

Tolga, were you able to resolve the problem? We have the same issue here. It's a simple script that sums up 4 fields. If scripted field is displayed in Issue Navigator (or is in the Excel export), and cache is not used, it takes 200ms to calculate per issue.

JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
March 29, 2016

is there a searcher for the script field?

Jakub Marek March 29, 2016

Hi, yes, there is a searcher:

Searcher: Free Text Searcher
Template: Text Field (multi-line)

It seems to slowdown at lines like: if (getCustomFieldValue(16700) != null)

Here's thread dump, but I don't know if that helps

com.google.common.cache.LocalCache$Segment.getLiveValue(LocalCache.java:2763)
com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2214)
com.google.common.cache.LocalCache.get(LocalCache.java:3970)
com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4834)
com.atlassian.cache.memory.DelegatingCache$DelegatingLoadingCache.get(DelegatingCache.java:316)
com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldsFromIds(DefaultCustomFieldManager.java:401)
com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldObjects(DefaultCustomFieldManager.java:389)
com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldObjects(DefaultCustomFieldManager.java:299)
com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldObjects(DefaultCustomFieldManager.java:287)
com.atlassian.jira.issue.managers.DefaultCustomFieldManager.getCustomFieldObjects(DefaultCustomFieldManager.java:274)
com.atlassian.jira.issue.CustomFieldManager$getCustomFieldObjects$0.call(Unknown Source)
com.onresolve.scriptrunner.customfield.GroovyCustomField$_getValueFromIssue_closure1.doCall(GroovyCustomField.groovy:117)
sun.reflect.GeneratedMethodAccessor1438.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1253)
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1209)
groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
groovy.lang.DelegatingMetaClass.invokeMethod(DelegatingMetaClass.java:149)
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl$2.invokeMethod(GroovyScriptEngineImpl.java:328)
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:81)
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:163)
Script12.run(Script12.groovy:15)
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:344)
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:145)
javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
javax.script.ScriptEngine$eval.call(Unknown Source)
com.onresolve.scriptrunner.runner.ScriptRunnerImpl.runStringAsScript(ScriptRunnerImpl.groovy:151)
com.onresolve.scriptrunner.runner.ScriptRunner$runStringAsScript.call(Unknown Source)
com.onresolve.scriptrunner.customfield.GroovyCustomField.getValueFromIssue(GroovyCustomField.groovy:147)
com.atlassian.jira.issue.fields.CustomFieldImpl.getValue(CustomFieldImpl.java:454)
com.atlassian.jira.issue.DocumentIssueImpl.getCustomFieldValue(DocumentIssueImpl.java:395)
com.atlassian.jira.issue.fields.CustomFieldImpl.getRendererCustomFieldValue(CustomFieldImpl.java:1043)
com.atlassian.jira.issue.fields.CustomFieldImpl.getColumnViewHtml(CustomFieldImpl.java:1037)
com.atlassian.jira.issue.fields.layout.column.ColumnLayoutItemImpl.getHtml(ColumnLayoutItemImpl.java:146)
sun.reflect.GeneratedMethodAccessor451.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:385)
org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:374)
com.atlassian.velocity.htmlsafe.introspection.AnnotationBoxingMethod.invoke(AnnotationBoxingMethod.java:26)
com.atlassian.velocity.htmlsafe.introspection.UnboxingMethod.invoke(UnboxingMethod.java:30)
org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:270)
org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:262)
org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:507)
org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71)
org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142)
org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
org.apache.velocity.runtime.directive.Foreach.performIteration(Foreach.java:393)
org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:316)
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175)
org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:212)
org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:247)
org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175)
org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87)
org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
org.apache.velocity.Template.merge(Template.java:328)
org.apache.velocity.Template.merge(Template.java:235)
org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngine.java:381)
com.atlassian.velocity.DefaultVelocityManager.writeEncodedBodyImpl(DefaultVelocityManager.java:117)
com.atlassian.velocity.DefaultVelocityManager.writeEncodedBody(DefaultVelocityManager.java:97)
com.atlassian.jira.template.velocity.DefaultVelocityTemplatingEngine$DefaultRenderRequest.toWriterImpl(DefaultVelocityTemplatingEngine.java:146)
com.atlassian.jira.template.velocity.DefaultVelocityTemplatingEngine$DefaultRenderRequest.asHtml(DefaultVelocityTemplatingEngine.java:134)
com.atlassian.jira.web.component.AbstractWebComponent.asHtml(AbstractWebComponent.java:54)
com.atlassian.jira.web.component.IssueTableWebComponent$1.write(IssueTableWebComponent.java:181)
com.atlassian.jira.issue.views.util.DefaultSearchRequestViewBodyWriterUtil$2.writeIssue(DefaultSearchRequestViewBodyWriterUtil.java:67)
com.atlassian.jira.issue.views.util.IssueWriterHitCollector.collect(IssueWriterHitCollector.java:30)
com.atlassian.jira.issue.statistics.util.DocumentHitCollector.collect(DocumentHitCollector.java:34)
com.atlassian.jira.issue.search.providers.LuceneSearchProvider.searchAndSort(LuceneSearchProvider.java:482)
com.atlassian.jira.issue.search.providers.LuceneSearchProvider.searchAndSort(LuceneSearchProvider.java:184)
com.atlassian.jira.issue.views.util.DefaultSearchRequestViewBodyWriterUtil.writeTableBody(DefaultSearchRequestViewBodyWriterUtil.java:71)
com.atlassian.jira.issue.views.AbstractSearchRequestExcelView.writeSearchResults(AbstractSearchRequestExcelView.java:85)
com.atlassian.jira.plugin.searchrequestview.DefaultSearchRequestURLHandler.handleRequest(DefaultSearchRequestURLHandler.java:417)
com.atlassian.jira.web.servlet.SearchRequestViewServlet.doGet(SearchRequestViewServlet.java:28)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:87)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.XContentTypeOptionsNoSniffFilter.doFilter(XContentTypeOptionsNoSniffFilter.java:22)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.core.filters.HeaderSanitisingFilter.doFilter(HeaderSanitisingFilter.java:44)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:46)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.jira.tzdetect.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:40)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.jira.baseurl.IncludeResourcesFilter.doFilter(IncludeResourcesFilter.java:38)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:25)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.mywork.client.filter.ServingRequestsFilter.doFilter(ServingRequestsFilter.java:37)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(PrettyUrlsSiteMeshFixupFilter.java:36)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(PrettyUrlsDispatcherFilter.java:60)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter.doFilter(PrettyUrlsSiteMeshFilter.java:92)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsMatcherFilter.doFilter(PrettyUrlsMatcherFilter.java:56)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.labs.botkiller.BotKillerFilter.doFilter(BotKillerFilter.java:36)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:77)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:63)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.accesslog.AccessLogFilter.executeRequest(AccessLogFilter.java:105)
com.atlassian.jira.web.filters.accesslog.AccessLogFilter.doFilter(AccessLogFilter.java:89)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.security.xsrf.XsrfTokenAdditionRequestFilter.doFilter(XsrfTokenAdditionRequestFilter.java:54)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.pagebuilder.PageBuilderFilter.doFilter(PageBuilderFilter.java:90)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.CommittedResponseHtmlErrorRecoveryFilter.doFilter(CommittedResponseHtmlErrorRecoveryFilter.java:63)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:46)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:77)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:63)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:239)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.security.auth.trustedapps.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:100)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.seraph.filter.BaseLoginFilter.doFilter(BaseLoginFilter.java:172)
com.atlassian.jira.web.filters.JiraLoginFilter.doFilter(JiraLoginFilter.java:70)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:46)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.oauth.serviceprovider.internal.servlet.OAuthFilter.doFilter(OAuthFilter.java:79)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:77)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:63)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:99)
com.atlassian.jira.web.filters.JIRAProfilingFilter.doFilter(JIRAProfilingFilter.java:19)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.johnson.filters.AbstractJohnsonFilter.doFilter(AbstractJohnsonFilter.java:71)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:46)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.jira.plugin.issuenav.LegacyTextQueryUrlRedirectFilter.doFilter(LegacyTextQueryUrlRedirectFilter.java:43)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.analytics.client.filter.JiraAnalyticsFilter.doFilter(JiraAnalyticsFilter.java:40)
com.atlassian.analytics.client.filter.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:32)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
com.atlassian.prettyurls.filter.PrettyUrlsCombinedMatchDispatcherFilter.doFilter(PrettyUrlsCombinedMatchDispatcherFilter.java:61)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(DelegatingPluginFilter.java:70)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:200)
net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:85)
net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:104)
com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(DelegatingPluginFilter.java:78)
com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(IteratingFilterChain.java:42)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:77)
com.atlassian.plugin.servlet.filter.ServletFilterModuleContainerFilter.doFilter(ServletFilterModuleContainerFilter.java:63)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:87)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.core.filters.cache.AbstractCachingFilter.doFilter(AbstractCachingFilter.java:33)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.core.filters.encoding.AbstractEncodingFilter.doFilter(AbstractEncodingFilter.java:41)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
com.atlassian.jira.web.filters.PathMatchingEncodingFilter.doFilter(PathMatchingEncodingFilter.java:49)
com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.startup.JiraStartupChecklistFilter.doFilter(JiraStartupChecklistFilter.java:79)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.MultipartBoundaryCheckFilter.doFilter(MultipartBoundaryCheckFilter.java:41)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.jira.web.filters.steps.ChainedFilterStepRunner.doFilter(ChainedFilterStepRunner.java:87)
com.atlassian.jira.web.filters.JiraFirstFilter.doFilter(JiraFirstFilter.java:61)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
com.atlassian.gzipfilter.GzipFilter.doFilterInternal(GzipFilter.java:121)
com.atlassian.gzipfilter.GzipFilter.doFilter(GzipFilter.java:92)
com.atlassian.jira.web.filters.gzip.JiraGzipFilter.doFilter(JiraGzipFilter.java:56)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:744)

 

 

JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
March 29, 2016

What type of field is 16700 ?

Jakub Marek March 30, 2016

It's Select List (single choice).

0 votes
Jiri Vomacka July 20, 2014

Thank you, I'll try it and write results.

0 votes
Jiri Vomacka July 3, 2014

The check for issuetype==21 is "only for sure" - the field is associated only to Epic issue type and only to this one specific project in its configuration.

The script itself tooks only several milliseconds (as logged using log.warn() in my script):

ScriptField Epic time summary took [ms] 16
ScriptField Epic time summary took [ms] 2
ScriptField Epic time summary took [ms] 7

But JIRA says (with profiler turned on, for a while) something like this:

[236ms] - Rendering navigable field 'customfield_12253' for issue: HRM-106
... 
[243ms] - Rendering navigable field 'customfield_12253' for issue: HRM-105
...
[208ms] - Rendering navigable field 'customfield_12253' for issue: HRM-104

and issue navigator's loading is slow.

I use the standard "Number Field" template.

JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 10, 2014

All I can suggest is using a proper profiler like JProfiler or yourkit, and turning on the CPU monitoring when you run the query. I can't reproduce any problem at all here.

I have seen big performance problems with some of jira's templates, particularly the one that renders a user profile (with avatar and full name etc), maybe it's something similar.

0 votes
JamieA
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
July 3, 2014

I can't reproduce any problem here at all. I tried your script, around 100 issues, displaying the script field value in the issue navigator, and it takes around 500ms total.

There must be some other problem. What is the template for this field?

> JIRA evaluates the custom field for each issue in the navigator - is there some overhead in Jira, while calling and executing groovy script?

Not in the sense that you mean... it's not treated as a script, it's just calling a method on a class that's in memory. The script is only compiled to a class once.

> I would expected that Jira takes the values from Lucene index...

It uses the index for searching, but not for displaying the values. I agree with you though, that would be better.

Rather than checking for issuetype == 21, why don't you associate this field only with Epics... at least that will mean it will only be evaluated for epics, and you can see if that makes a difference.

But like I say, for me, a hundred invocations of this script takes < 10ms.

Also try replacing the script with just "return 1", and see if that makes a difference. Try to narrow this down a bit...

Suggest an answer

Log in or Sign up to answer