Details
-
Bug
-
Resolution: Fixed
-
Medium
-
4.0
-
4
-
1
-
Description
Symptoms
Filters affected are only those which:
- Specify a clause using the "select custom field"
- The value of the clause references an option which has the same name as an option that was previously deleted from a custom field context
NullPointerException appears in the logs during upgrade to 4.0 data which contains specific filters:
2009-10-06 17:48:40,626 Thread-1 WARN [jira.upgrade.tasks.UpgradeTask_Build428] Could not namify the query: 'null' com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NullPointerException at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:152) at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:115) at com.atlassian.jira.issue.customfields.option.LazyLoadedOption.getRelatedCustomField(LazyLoadedOption.java:61) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getFieldFromOption(JqlSelectOptionsUtil.java:234) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getOptionFromString(JqlSelectOptionsUtil.java:207) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getOptions(JqlSelectOptionsUtil.java:134) at com.atlassian.jira.jql.context.SelectCustomFieldClauseContextFactory.getContextOptions(SelectCustomFieldClauseContextFactory.java:109) at com.atlassian.jira.jql.context.SelectCustomFieldClauseContextFactory.getClauseContext(SelectCustomFieldClauseContextFactory.java:68) at com.atlassian.jira.jql.context.MultiClauseDecoratorContextFactory.getClauseContext(MultiClauseDecoratorContextFactory.java:66) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:134) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.TerminalClauseImpl.accept(TerminalClauseImpl.java:137) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:80) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:34) at com.atlassian.jira.jql.context.QueryContextVisitor.createContext(QueryContextVisitor.java:55) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:73) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:34) at com.atlassian.jira.bc.issue.search.DefaultSearchService.getSimpleQueryContext(DefaultSearchService.java:221) at com.atlassian.jira.bc.issue.search.DefaultSearchService.getSearchContext(DefaultSearchService.java:123) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.getNamifiedQuery(UpgradeTask_Build428.java:200) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.getQueryFromXml(UpgradeTask_Build428.java:312) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.upgradeSearchRequests(UpgradeTask_Build428.java:149) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.doUpgrade(UpgradeTask_Build428.java:129) at com.atlassian.jira.upgrade.UpgradeManagerImpl.doUpgradeTaskSucess(UpgradeManagerImpl.java:508) at com.atlassian.jira.upgrade.UpgradeManagerImpl.runUpgradeTasks(UpgradeManagerImpl.java:419) at com.atlassian.jira.upgrade.UpgradeManagerImpl.doUpgrade(UpgradeManagerImpl.java:356) at com.atlassian.jira.upgrade.UpgradeManagerImpl.doUpgradeIfNeeded(UpgradeManagerImpl.java:307) at com.atlassian.jira.upgrade.UpgradeManagerImpl.doUpgradeIfNeededAndAllowed(UpgradeManagerImpl.java:246) at com.atlassian.jira.upgrade.UpgradeLauncher.checkIfUpgradeNeeded(UpgradeLauncher.java:100) at com.atlassian.jira.upgrade.UpgradeLauncher.contextInitialized(UpgradeLauncher.java:49) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3795) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4252) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014) at org.apache.catalina.core.StandardHost.start(StandardHost.java:736) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:448) at org.apache.catalina.core.StandardServer.start(StandardServer.java:700) at org.apache.catalina.startup.Catalina.start(Catalina.java:552) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433) Caused by: java.lang.NullPointerException at com.atlassian.jira.issue.fields.config.persistence.FieldConfigPersisterImpl.getFieldConfig(FieldConfigPersisterImpl.java:186) at com.atlassian.jira.issue.fields.config.manager.FieldConfigManagerImpl.getFieldConfig(FieldConfigManagerImpl.java:33) at com.atlassian.jira.issue.customfields.option.LazyLoadedOption$1.create(LazyLoadedOption.java:30) at com.atlassian.jira.issue.customfields.option.LazyLoadedOption$1.create(LazyLoadedOption.java:28) at com.atlassian.util.concurrent.LazyReference$1.call(LazyReference.java:79) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:146) at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:115) at com.atlassian.jira.issue.customfields.option.LazyLoadedOption.getRelatedCustomField(LazyLoadedOption.java:61) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getFieldFromOption(JqlSelectOptionsUtil.java:234) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getOptionFromString(JqlSelectOptionsUtil.java:207) at com.atlassian.jira.jql.util.JqlSelectOptionsUtil.getOptions(JqlSelectOptionsUtil.java:134) at com.atlassian.jira.jql.context.SelectCustomFieldClauseContextFactory.getContextOptions(SelectCustomFieldClauseContextFactory.java:109) at com.atlassian.jira.jql.context.SelectCustomFieldClauseContextFactory.getClauseContext(SelectCustomFieldClauseContextFactory.java:68) at com.atlassian.jira.jql.context.MultiClauseDecoratorContextFactory.getClauseContext(MultiClauseDecoratorContextFactory.java:66) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:134) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.TerminalClauseImpl.accept(TerminalClauseImpl.java:137) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:80) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:34) at com.atlassian.jira.jql.context.QueryContextVisitor.createContext(QueryContextVisitor.java:55) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:73) at com.atlassian.jira.jql.context.QueryContextVisitor.visit(QueryContextVisitor.java:36) at com.atlassian.query.clause.AndClause.accept(AndClause.java:34) at com.atlassian.jira.bc.issue.search.DefaultSearchService.getSimpleQueryContext(DefaultSearchService.java:221) at com.atlassian.jira.bc.issue.search.DefaultSearchService.getSearchContext(DefaultSearchService.java:123) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.getNamifiedQuery(UpgradeTask_Build428.java:200) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.getQueryFromXml(UpgradeTask_Build428.java:312) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.upgradeSearchRequests(UpgradeTask_Build428.java:149) at com.atlassian.jira.upgrade.tasks.UpgradeTask_Build428.doUpgrade(UpgradeTask_Build428.java:121) ... 22 more
NullPointerException appears in a stack trace when running specific JQL filters in the Issue Navigator
Stack trace is similar to the above
Diagnosis
If you're seeing these exceptions, have a look at the customer data and find out if there are any records in the customfieldoption table which reference non-existant fieldconfiguration records. Here is the SQL:
select * from customfieldoption where customfieldconfig not in (select id from fieldconfiguration)
If there are records returned, then any search which mentions the customvalue s as the right hand side of a select custom field clause will be affected.
Cause
When deleting a custom field context for a select custom field, the options created are not deleted. They remain in the customfieldoption table, with references to a fieldconfiguration (custom field context) that no longer exists (because it was deleted).
A JQL clause that references the option "NAME" will look up all stored custom field options with that name, and attempt to resolve each option to its related field, in order to calculate the context of the clause. This includes all "dead options". When the related custom field is looked up, the NullPointerException is thrown.