Details
-
Bug
-
Resolution: Unresolved
-
Low
-
None
-
8.5.4
-
8.05
-
11
-
Severity 3 - Minor
-
1
-
Description
Summary
Jira is returning server error (500) as a part of the response to Parse Exception thrown when typing some characters string in JQL. For example, when there is parseException while invoking /rest/api/2/jql/autocompletedata/suggestions API, Jira is returning "Returning internal server error in responsejava.lang.reflect.InvocationTargetException"
How to Replicate
- If you do a JQL search for:
- filter = "some filter name"/asdasd
OR
- Setup a Jira env, I used 8.5.4;
- Create 1 filter called "FilterOne"
- Open jira-application.logs (tail -f)
- Open a JQL advanced search and write: filter = FilterOne
- Then, insert in the final a double-quotes, and then it appears:
We are apparently still doing a lookup for each character added to the end of the string after the endquote, causing a ParseException to be thrown in the logs:
2021-06-11 16:37:00,756-0300 http-nio-8854-exec-19 ERROR mcardoso2 997x393x1 y9rkp 0:0:0:0:0:0:0:1 /rest/api/2/jql/autocompletedata/suggestions [c.a.j.rest.exception.ExceptionInterceptor] Returning internal server error in response2021-06-11 16:37:00,756-0300 http-nio-8854-exec-19 ERROR mcardoso2 997x393x1 y9rkp 0:0:0:0:0:0:0:1 /rest/api/2/jql/autocompletedata/suggestions [c.a.j.rest.exception.ExceptionInterceptor] Returning internal server error in responsejava.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.atlassian.plugins.rest.common.interceptor.impl.DispatchProviderHelper$ResponseOutInvoker$1.invoke(DispatchProviderHelper.java:192) ... 4 filtered at com.atlassian.jira.rest.exception.ExceptionInterceptor.intercept(ExceptionInterceptor.java:55) ... 1 filtered at com.atlassian.jira.rest.v2.issue.scope.RequestScopeInterceptor.intercept(RequestScopeInterceptor.java:39) ... 15 filtered at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:159) ... 1 filtered at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:69) ... 32 filtered at com.atlassian.servicedesk.internal.web.ExternalCustomerLockoutFilter.doFilter(ExternalCustomerLockoutFilter.java:55) ... 8 filtered at com.atlassian.jira.plugin.mobile.web.filter.MobileAppRequestFilter.doFilter(MobileAppRequestFilter.java:37) ... 4 filtered at com.atlassian.jira.plugin.mobile.login.MobileLoginSuccessFilter.doFilter(MobileLoginSuccessFilter.java:54) ... 3 filtered at com.atlassian.diagnostics.internal.platform.monitor.http.HttpRequestMonitoringFilter.doFilter(HttpRequestMonitoringFilter.java:55) ... 8 filtered at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21) ... 57 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:213) at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.rteInvoke(ReentrantThreadLocalBasedCodeContext.java:136) at com.atlassian.servicedesk.internal.api.util.context.ReentrantThreadLocalBasedCodeContext.runOutOfContext(ReentrantThreadLocalBasedCodeContext.java:89) at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.runOutOfCustomerContext(CustomerContextServiceImpl.java:47) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:204) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:135) at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:124) ... 4 filtered at com.atlassian.jwt.internal.servlet.JwtAuthFilter.doFilter(JwtAuthFilter.java:37) ... 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) ... 25 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)Caused by: com.atlassian.jira.sharing.search.SearchParseException: org.apache.lucene.queryparser.classic.ParseException: Cannot parse 'FilterOne"': Lexical error at line 1, column 11. Encountered: <EOF> after : "" at com.atlassian.jira.sharing.index.QueryBuilder.parseQuery(QueryBuilder.java:178) at com.atlassian.jira.sharing.index.QueryBuilder.addParsedQuery(QueryBuilder.java:101) at com.atlassian.jira.sharing.index.DefaultQueryFactory$Builder.addParsedQueries(DefaultQueryFactory.java:113) at com.atlassian.jira.sharing.index.DefaultQueryFactory$Builder.build(DefaultQueryFactory.java:99) at com.atlassian.jira.sharing.index.DefaultQueryFactory.create(DefaultQueryFactory.java:49) at com.atlassian.jira.issue.search.DefaultSearchRequestManager.lambda$search$2(DefaultSearchRequestManager.java:337) at com.atlassian.jira.sharing.index.DefaultSharedEntityIndexer.withSearcher(DefaultSharedEntityIndexer.java:188) at com.atlassian.jira.issue.search.DefaultSearchRequestManager.search(DefaultSearchRequestManager.java:337) at com.atlassian.jira.bc.filter.DefaultSearchRequestService.search(DefaultSearchRequestService.java:396) at com.atlassian.jira.jql.values.SavedFilterValuesGenerator.getPossibleValues(SavedFilterValuesGenerator.java:33) at com.atlassian.jira.rest.internal.jql.FieldAndPredicateAutoCompleteResultGenerator.generateResults(FieldAndPredicateAutoCompleteResultGenerator.java:82) at com.atlassian.jira.rest.internal.jql.FieldAndPredicateAutoCompleteResultGenerator.getAutoCompleteResultsForField(FieldAndPredicateAutoCompleteResultGenerator.java:53) at com.atlassian.jira.rest.v2.search.SearchAutoCompleteResource.getFieldAutoCompleteForQueryString(SearchAutoCompleteResource.java:135) ... 274 moreCaused by: org.apache.lucene.queryparser.classic.ParseException: Cannot parse 'FilterOne"': Lexical error at line 1, column 11. Encountered: <EOF> after : "" at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:114) at com.atlassian.jira.sharing.index.QueryBuilder.parseQuery(QueryBuilder.java:176) ... 287 moreCaused by: org.apache.lucene.queryparser.classic.TokenMgrError: Lexical error at line 1, column 11. Encountered: <EOF> after : "" at org.apache.lucene.queryparser.classic.QueryParserTokenManager.getNextToken(QueryParserTokenManager.java:1119) at org.apache.lucene.queryparser.classic.QueryParser.jj_3R_3(QueryParser.java:668) at org.apache.lucene.queryparser.classic.QueryParser.jj_3_1(QueryParser.java:702) at org.apache.lucene.queryparser.classic.QueryParser.jj_2_1(QueryParser.java:646) at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:225) at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:215) at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:109) ... 288 more
Investigation Done
After some research, it seems Lucene has problems parsing terms that end with special characters like double-quotes, blankets, and backslash. So, Jira might need to treats it at the code level.
Workaround for Monitoring Tools
You have to adapt your monitoring tools to rule this out on the monitoring tool level itself for the time being, until we can have a code fix.
For example, rule out any internal server error associated with ParseException.
Suggestion
Our suggestion is that nowhere in the REST API should return 500 responses unless Jira is down. Various 4xx would be much better for a parseException.