-
Bug
-
Resolution: Fixed
-
Low (View bug fix roadmap)
-
7.12.3
-
7.12
-
4
-
Severity 2 - Major
-
15
-
Summary
Users on Data Center trying to open the CustomFieldOptimizer after the first scan will get a blank page and will not be able to make use of this feature.
Symptoms
The 'Custom Field Optimizer' is running into the following NullPointerException:
2018-11-21 16:55:22,673 http-nio-7123-exec-18 ERROR admin 1015x455x2 14fjner 0:0:0:0:0:0:0:1 /rest/optimizer/1/recommendations/info [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: null java.lang.NullPointerException at com.atlassian.jira.optimizer.ao.RecommendationsDao.parceProjectIdString(RecommendationsDao.java:74) at com.atlassian.jira.optimizer.beans.RecommendationBean.<init>(RecommendationBean.java:66) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) at com.atlassian.jira.optimizer.impl.RecommendationsManager.getRecommendations(RecommendationsManager.java:183) at com.atlassian.jira.optimizer.impl.DefaultOptimizerService.getRecommendationsInfo(DefaultOptimizerService.java:109) at com.atlassian.jira.optimizer.rest.OptimizerResource.getRecommendationsInfo(OptimizerResource.java:103) ... 3 filtered at java.lang.reflect.Method.invoke(Method.java:498) ... 19 filtered at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:154) ... 1 filtered at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:68) ... 32 filtered at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:56) ... 13 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 53 filtered at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:66) ... 1 filtered at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:64) ... 16 filtered at com.atlassian.plugins.rest.module.servlet.RestSeraphFilter.doFilter(RestSeraphFilter.java:37) ... 19 filtered at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30) ... 5 filtered at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:181) at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.rteInvoke(ReentrantThreadLocalBasedCodeContext.java:137) at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.runOutOfContext(ReentrantThreadLocalBasedCodeContext.java:90) at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.runOutOfCustomerContext(CustomerContextServiceImpl.java:47) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:174) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:130) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:121) ... 4 filtered at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:32) ... 8 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 4 filtered at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36) ... 26 filtered at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25) ... 24 filtered at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
This is affecting JIRA application running with Oracle database.
Cause:
When we run the optimizer scan, "AO_0AC321_RECOMMENDATION_AO" database table is populated. If the PROJECT_IDS is empty, NULL is inserted instead of en empty string – for Oracle database.
package com.atlassian.jira.optimizer.ao where class resides -
public static List<Long> parceProjectIdString(String projectIdString) { return "".equals(projectIdString) ? Collections.emptyList() : (List)Stream.of(projectIdString.split(",")).map(Long::parseLong).collect(Collectors.toList()); }
Reproduce
- Create Oracle database for Jira
- Connect Jira DC to database
- Create Project (empty or sample)
- Create custom field with global context
- Navigate to Jira administration -> System -> Custom Field Optimizer
- Do initial scan
- Come back to 'Custom Field Optimizer' page
Expected Results
User should see recommendations
Actual Results
Blank screen for this feature
Workaround
No workaround for Oracle database users, as "AO_0AC321_RECOMMENDATION_AO" is always re-populated on scan, so removing the NULL records won't work.
- mentioned in
-
Page Failed to load
-
Page Failed to load
-
Page Failed to load
-
Page Failed to load
-
Page Failed to load
-
Page Loading...
- relates to
-
POSTSEFCON-6027 Loading...
-
FLASH-1167 Loading...
we have 2 JSD DC 7.12.3... prod and a clone (dev), both using MS-SQL Server. On prod, this option is missing.. in Dev, it shows up... however, if I copy&paste the URL from dev to prod, it shows up as well...
<jira;:port>/secure/admin/CustomfieldsAnalyzer.jspa
So, what the ...???