QueryPhaseExecutionException when exeeding th 10000 limit with implicit page size

In SQ 8.1.0, if an /api/issues/search request is issued for page 21 or higher with page size -1 which effectively uses the maximum 500 (&p=21&ps=-1), you get a HTTP 500 error with response body {"errors":[{"msg":"An error has occurred. Please contact your administrator"}]} back and in the web.log this:

2020.02.27 13:29:27 ERROR web[AXCF8/ciXgqeWl5GAAGw][o.s.s.w.WebServiceEngine] Fail to process request http://.../api/issues/search?...&p=21&ps=-1&...
java.lang.IllegalStateException: Fail to execute ES search request 'SearchRequest{searchType=QUERY_THEN_FETCH, indices=[issues], indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false, ignore_throttled=true], types=[auth], routing='auth_bd07752c-e400-4208-a61e-83b269157aad', preference='null', requestCache=null, scroll=null, maxConcurrentShardRequests=0, batchedReduceSize=512, preFilterShardSize=128,allowPartialSearchResults=null, localClusterAlias=null, getOrCreateAbsoluteStartMillis=-1, source={"from":10000,"size":500,"query":{"bool":{"must":[{"match_all":{"boost":1.0}}],"filter":[{"bool":{"must":[{"term":{"isMainBranch":{"value":"true","boost":1.0}}},{"bool":{"must_not":[{"exists":{"field":"resolution","boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},{"terms":{"project":["bd07752c-e400-4208-a61e-83b269157aad"],"boost":1.0}},{"term":{"indexType":{"value":"issue","boost":1.0}}},{"bool":{"adjust_pure_negative":true,"boost":1.0}},{"has_parent":{"query":{"bool":{"filter":[{"bool":{"should":[{"term":{"auth_allowAnyone":{"value":true,"boost":1.0}}},{"term":{"auth_userIds":{"value":2,"boost":1.0}}},{"term":{"auth_groupIds":{"value":6,"boost":1.0}}},{"term":{"auth_groupIds":{"value":7,"boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"parent_type":"auth","score":false,"ignore_unmapped":false,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}}],"adjust_pure_negative":true,"boost":1.0}},"_source":false,"sort":[{"issueCreatedAt":{"order":"desc","missing":"_first"}},{"project":{"order":"asc","missing":"_first"}},{"filePath":{"order":"asc","missing":"_first"}},{"line":{"order":"asc","missing":"_first"}},{"key":{"order":"asc","missing":"_first"}}],"aggregations":{"effort":{"sum":{"field":"effort"}}}}}' on indices '[issues]' on types '[auth]'
        at org.sonar.server.es.request.ProxySearchRequestBuilder.get(ProxySearchRequestBuilder.java:44)
        at org.sonar.server.es.request.ProxySearchRequestBuilder.get(ProxySearchRequestBuilder.java:32)
        at org.sonar.server.issue.index.IssueIndex.search(IssueIndex.java:337)
        at org.sonar.server.issue.ws.SearchAction.doHandle(SearchAction.java:410)
        at org.sonar.server.issue.ws.SearchAction.handle(SearchAction.java:391)
        at org.sonar.server.ws.WebServiceEngine.execute(WebServiceEngine.java:110)
        at org.sonar.server.platform.web.WebServiceFilter.doFilter(WebServiceFilter.java:88)
        at org.sonar.server.platform.web.MasterServletFilter$GodFilterChain.doFilter(MasterServletFilter.java:139)
        at org.sonar.server.platform.web.MasterServletFilter.doFilter(MasterServletFilter.java:108)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:88)
        at org.sonar.server.platform.web.UserSessionFilter.doFilter(UserSessionFilter.java:72)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.CacheControlFilter.doFilter(CacheControlFilter.java:76)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.SecurityServletFilter.doHttpFilter(SecurityServletFilter.java:76)
        at org.sonar.server.platform.web.SecurityServletFilter.doFilter(SecurityServletFilter.java:48)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.RedirectFilter.doFilter(RedirectFilter.java:58)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.RequestIdFilter.doFilter(RequestIdFilter.java:66)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.sonar.server.platform.web.RootFilter.doFilter(RootFilter.java:62)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:256)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException: all shards failed
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseFailure(AbstractSearchAsyncAction.java:296)
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.executeNextPhase(AbstractSearchAsyncAction.java:133)
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onPhaseDone(AbstractSearchAsyncAction.java:259)
        at org.elasticsearch.action.search.InitialSearchPhase.onShardFailure(InitialSearchPhase.java:100)
        at org.elasticsearch.action.search.InitialSearchPhase.access$100(InitialSearchPhase.java:48)
        at org.elasticsearch.action.search.InitialSearchPhase$2.lambda$onFailure$1(InitialSearchPhase.java:220)
        at org.elasticsearch.action.search.InitialSearchPhase.maybeFork(InitialSearchPhase.java:174)
        at org.elasticsearch.action.search.InitialSearchPhase.access$000(InitialSearchPhase.java:48)
        at org.elasticsearch.action.search.InitialSearchPhase$2.onFailure(InitialSearchPhase.java:220)
        at org.elasticsearch.action.search.SearchExecutionStatsCollector.onFailure(SearchExecutionStatsCollector.java:73)
        at org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:59)
        at org.elasticsearch.action.search.SearchTransportService$ConnectionCountingHandler.handleException(SearchTransportService.java:463)
        at org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:1114)
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.processException(TransportService.java:1226)
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.sendResponse(TransportService.java:1200)
        at org.elasticsearch.transport.TaskTransportChannel.sendResponse(TaskTransportChannel.java:60)
        at org.elasticsearch.action.support.ChannelActionListener.onFailure(ChannelActionListener.java:56)
        at org.elasticsearch.search.SearchService$2.onFailure(SearchService.java:367)
        at org.elasticsearch.search.SearchService$2.onResponse(SearchService.java:361)
        at org.elasticsearch.search.SearchService$2.onResponse(SearchService.java:355)
        at org.elasticsearch.search.SearchService$4.doRun(SearchService.java:1107)
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
        at org.elasticsearch.common.util.concurrent.TimedRunnable.doRun(TimedRunnable.java:41)
        at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:751)
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.elasticsearch.search.query.QueryPhaseExecutionException: Result window is too large, from + size must be less than or equal to: [10000] but was [10500]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.
        at org.elasticsearch.search.DefaultSearchContext.preProcess(DefaultSearchContext.java:212)
        at org.elasticsearch.search.query.QueryPhase.preProcess(QueryPhase.java:91)
        at org.elasticsearch.search.SearchService.createContext(SearchService.java:649)
        at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:596)
        at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:387)
        at org.elasticsearch.search.SearchService.access$100(SearchService.java:126)
        at org.elasticsearch.search.SearchService$2.onResponse(SearchService.java:359)
        ... 9 common frames omitted

If you have an explicit positive page size or no page size at all, you get an HTTP 400 with a meaningful error message:
&p=101 => {"errors":[{"msg":"Can return only the first 10000 results. 10100th result asked."}]}
&p=21&ps=500 => {"errors":[{"msg":"Can return only the first 10000 results. 10500th result asked."}]}
&p=10001&ps=1 => {"errors":[{"msg":"Can return only the first 10000 results. 10001th result asked."}]}

There is indeed something wrong here. I tracked this down in this ticket. Thanks a lot for the feedback!