MergeOp: Reload changes and double-check submitted status
Secondary index reads in theory shouldn't be delayed, but who knows,
they might be. Don't trust the change populated from the
InternalChangeQuery call, and reload it from the db instead. If the
change isn't actually submitted, skip it. This also narrows the window
wherein a human abandoning a change can race with the submit queue.
Change-Id: I1254f3d3def55cd1a39647cc8e5873c08373c465
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
index 1aa4402..46619f6 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/MergeOp.java
@@ -514,11 +514,16 @@
Change chg;
try {
ctl = cd.changeControl();
- chg = cd.change();
+ // Reload change in case index was stale.
+ chg = cd.reloadChange();
} catch (OrmException e) {
throw new MergeException("Failed to validate changes", e);
}
Change.Id changeId = cd.getId();
+ if (chg.getStatus() != Change.Status.SUBMITTED) {
+ logDebug("Change {} is not submitted: {}", changeId, chg.getStatus());
+ continue;
+ }
if (chg.currentPatchSetId() == null) {
logError("Missing current patch set on change " + changeId);
commits.put(changeId, CodeReviewCommit.noPatchSet(ctl));
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
index b3a0a9a..d9dad78 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -445,11 +445,16 @@
public Change change() throws OrmException {
if (change == null) {
- change = db.changes().get(legacyId);
+ reloadChange();
}
return change;
}
+ public Change reloadChange() throws OrmException {
+ change = db.changes().get(legacyId);
+ return change;
+ }
+
public ChangeNotes notes() throws OrmException {
if (notes == null) {
notes = notesFactory.create(change());