Files
gerrit/java/com/google/gerrit/server
Edwin Kempin db93e2e379 Submit: if change to be submitted is missing in index result check if it is merged
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
2019-12-19 16:28:25 +01:00
..
2019-12-13 21:52:11 +01:00
2019-12-19 10:36:02 +00:00
2019-12-13 15:41:45 +01:00