Backlog is slow to load
Platform Notice: Data Center - This article applies to Atlassian products on the Data Center platform.
Note that this knowledge base article was created for the Data Center version of the product. Data Center knowledge base articles for non-Data Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Except Fisheye and Crucible
Problem
The Backlog is slow to load.
Diagnosis
Environment
- JIRA 6.1 or 6.2 with JIRA Agile 6.6.60 or higher.
- A high number of Epic Links present on the board.
Diagnostic Steps
Generating a Thread Dump while the board is loading indicates a lock while waiting for a database response:
"http-bio-8080-exec-18" daemon prio=5 tid=0x00007ff3d097a000 nid=0x7607 runnable [0x000000011a475000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.io.DataInputStream.readFully(DataInputStream.java:195) at java.io.DataInputStream.readFully(DataInputStream.java:169) at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:842) at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:723) - locked <0x00000007a33f0b98> (a java.util.ArrayList) at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466) at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:103) at net.sourceforge.jtds.jdbc.ResponseStream.peek(ResponseStream.java:88) at net.sourceforge.jtds.jdbc.TdsCore.wait(TdsCore.java:3932) at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1046) - locked <0x00000007f9950fe0> (a net.sourceforge.jtds.jdbc.TdsCore) at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:465) at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:778) - locked <0x00000007a33f0680> (a net.sourceforge.jtds.jdbc.ConnectionJDBC3) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) at org.ofbiz.core.entity.jdbc.SQLProcessor.executeQuery(SQLProcessor.java:597) at org.ofbiz.core.entity.GenericDAO.selectListIteratorByCondition(GenericDAO.java:851) at org.ofbiz.core.entity.GenericDAO.selectByAnd(GenericDAO.java:725) at org.ofbiz.core.entity.GenericHelperDAO.findByAnd(GenericHelperDAO.java:150) at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:901) at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:879) at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:848) at com.opensymphony.module.propertyset.ofbiz.OFBizPropertySet.findPropertyEntry(OFBizPropertySet.java:298) at com.opensymphony.module.propertyset.ofbiz.OFBizPropertySet.get(OFBizPropertySet.java:266) at com.opensymphony.module.propertyset.AbstractPropertySet.getLong(AbstractPropertySet.java:247) at com.atlassian.jira.propertyset.JiraCachingPropertySet.getLong(JiraCachingPropertySet.java:424) at com.atlassian.greenhopper.service.PersistenceServiceImpl.getLong(PersistenceServiceImpl.java:63) at com.atlassian.greenhopper.service.properties.PropertyDao.getLongProperty(PropertyDao.java:29) at com.atlassian.greenhopper.service.issuelink.EpicCustomFieldServiceImpl.getDefaultFieldOrNull(EpicCustomFieldServiceImpl.java:181) at com.atlassian.greenhopper.service.issuelink.EpicCustomFieldServiceImpl.getDefaultField(EpicCustomFieldServiceImpl.java:163) at com.atlassian.greenhopper.service.issuelink.EpicCustomFieldServiceImpl.getDefaultEpicLinkField(EpicCustomFieldServiceImpl.java:85) at com.atlassian.greenhopper.web.rapid.issue.fields.EpicLinkFieldEntryFactory.createViewEntry(EpicLinkFieldEntryFactory.java:57) at com.atlassian.greenhopper.web.rapid.issue.fields.EpicLinkFieldEntryFactory.createViewEntry(EpicLinkFieldEntryFactory.java:23) at com.atlassian.greenhopper.web.rapid.list.ExtraFieldsHelper.renderField(ExtraFieldsHelper.java:136) at com.atlassian.greenhopper.web.rapid.list.ExtraFieldsHelper.renderField(ExtraFieldsHelper.java:105) at com.atlassian.greenhopper.web.rapid.list.EpicCallbackComponent.processFieldData(EpicCallbackComponent.java:49) at com.atlassian.greenhopper.web.rapid.list.RapidIssueEntryCallback.createVisibleEntry(RapidIssueEntryCallback.java:249) at com.atlassian.greenhopper.web.rapid.list.RapidIssueEntryCallback.fieldData(RapidIssueEntryCallback.java:207) at com.atlassian.greenhopper.service.issue.callback.AbstractCompoundDataCallback.issueComplete(AbstractCompoundDataCallback.java:45) at com.atlassian.greenhopper.service.issue.callback.ComposedIssueDataCallback.issueComplete(ComposedIssueDataCallback.java:75) at com.atlassian.greenhopper.service.issue.IssueDataCollector.collect(IssueDataCollector.java:86) at com.atlassian.greenhopper.service.issue.IssueDataCollector.collect(IssueDataCollector.java:58) at com.atlassian.jira.issue.search.providers.LuceneSearchProvider.searchAndSort(LuceneSearchProvider.java:478) at com.atlassian.jira.issue.search.providers.LuceneSearchProvider.searchAndSort(LuceneSearchProvider.java:179) at sun.reflect.GeneratedMethodAccessor574.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.atlassian.plugin.osgi.hostcomponents.impl.DefaultComponentRegistrar$ContextClassLoaderSettingInvocationHandler.invoke(DefaultComponentRegistrar.java:129) at com.sun.proxy.$Proxy265.searchAndSort(Unknown Source) at sun.reflect.GeneratedMethodAccessor574.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.atlassian.plugin.osgi.bridge.external.HostComponentFactoryBean$DynamicServiceInvocationHandler.invoke(HostComponentFactoryBean.java:154) at com.sun.proxy.$Proxy265.searchAndSort(Unknown Source) at com.atlassian.greenhopper.service.issue.IssueDataServiceImpl.findImpl(IssueDataServiceImpl.java:156) at com.atlassian.greenhopper.service.issue.IssueDataServiceImpl.findAndSortWithServiceOutcome(IssueDataServiceImpl.java:63) at com.atlassian.greenhopper.web.rapid.list.RapidIssueEntryQueryServiceImpl.collectIssues(RapidIssueEntryQueryServiceImpl.java:713) at com.atlassian.greenhopper.web.rapid.list.RapidIssueEntryQueryServiceImpl.collectPlanModeIssues(RapidIssueEntryQueryServiceImpl.java:361) at com.atlassian.greenhopper.web.rapid.plan.PlanningModeServiceImpl.getBacklogIssuesAndSprintAssignment(PlanningModeServiceImpl.java:96) at com.atlassian.greenhopper.web.rapid.plan.PlanningModeHelper.loadNewBacklogData(PlanningModeHelper.java:123) at com.atlassian.greenhopper.web.rapid.plan.PlanningModeResource$1.call(PlanningModeResource.java:95) at com.atlassian.greenhopper.web.rapid.plan.PlanningModeResource$1.call(PlanningModeResource.java:84) at com.atlassian.greenhopper.web.util.RestCall.response(RestCall.java:42) at com.atlassian.greenhopper.web.AbstractResource.createResponse(AbstractResource.java:100) at com.atlassian.greenhopper.web.AbstractResource.response(AbstractResource.java:81) at com.atlassian.greenhopper.web.rapid.plan.PlanningModeResource.getBacklogData(PlanningModeResource.java:83) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- Looking at the Network tab in Google Chrome's Developer Tools shows a large amount of time spent on the /rest/greenhopper/1.0/xboard/plan/backlog request:
Cause
The main suspicion at the moment is that JIRA Agile is running a lot of SQL requests that are holding up the threads while loading the Backlog. A more efficient way to handle this is currently being tracked as part of:
- JSWSERVER-6925 Investigate SQL query count executed for a single request
- JSWSERVER-10819 Cache frequently used PropertySets
Resolution
- JIRA 6.3 or later has been noted to improve the performance when loading the Backlog