Sometimes submit fails with IllegalStateException "change ... missing
from ChangeSet[][]" [1]. One possibility how this can happen is that the
change was merged by a concurrent request in the meantime:
1. [request 1] Change is ready to submit
2. [request 1] The Submit REST endpoint is invoked for it.
3. [request 1] The Submit REST endpoint checks that the change is open.
4. [request 2] A concurrent request submits the change.
5. [request 1] MergeSuperSet is used to find the changes that need to be
submitted together.
6. [request 1] The index query in
LocalMergeSuperSetComputation.byCommitsOnBranchNotMerged queries for
non-merged changes ("-status:merged") and has no result (since the
change was merged in the meantime by request 2).
7. MergeOp fails because the change is missing in the set of changes
that should be submitted.
Instead of failing reload the change and check if it is merged now. If
yes return 409 Conflict to the client as we do when the Submit REST
endpoint is invoked for a merged change. If not, throw the same
IllegalStateException as before.
[1]
java.lang.IllegalStateException: change 9926335 missing from ChangeSet[][]
at com.google.common.base.Preconditions.checkState(Preconditions.java:824)
at com.google.gerrit.server.submit.MergeOp.merge(MergeOp.java:463)
at com.google.gerrit.server.restapi.change.Submit.mergeChange(Submit.java:210)
at com.google.gerrit.server.restapi.change.Submit.apply(Submit.java:186)
at com.google.gerrit.server.restapi.change.Submit.apply(Submit.java:81)
at com.google.gerrit.httpd.restapi.RestApiServlet.lambda$invokeRestModifyViewWithRetry$4(RestApiServlet.java:757)
at com.github.rholder.retry.AttemptTimeLimiters$NoAttemptTimeLimit.call(AttemptTimeLimiters.java:78)
at com.github.rholder.retry.Retryer.call(Retryer.java:160)
at com.google.gerrit.server.update.RetryHelper.executeWithTimeoutCount(RetryHelper.java:419)
at com.google.gerrit.server.update.RetryHelper.executeWithAttemptAndTimeoutCount(RetryHelper.java:368)
at com.google.gerrit.server.update.RetryHelper.execute(RetryHelper.java:273)
at com.google.gerrit.httpd.restapi.RestApiServlet.invokeRestEndpointWithRetry(RestApiServlet.java:836)
at com.google.gerrit.httpd.restapi.RestApiServlet.invokeRestModifyViewWithRetry(RestApiServlet.java:752)
at com.google.gerrit.httpd.restapi.RestApiServlet.service(RestApiServlet.java:516)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
...
Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I8061b7a18d83f8c8e743a7a9eb575963d37ae4f4