summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2014-06-10 21:47:04 +0200
committerIsmo Haataja <ismo.haataja@digia.com>2014-10-15 09:00:41 +0200
commit7d37ff3143e5fc8f32dda9e1abe2dde5db24248c (patch)
tree18f3ddefd188868215d1d1123761761fe00e2747
parentcf8a3e5790b5c6392e376c307434dd0302096afc (diff)
ChangeMergeQueue: Fix race condition
To the multiple triggers of submit action belong: * ChangeMergeQueue.merge() method called from the UI * ChangeMergeQueue.schedule() method called by background ReloadSubmitQueueOp active map in ChangeMergeQueue acts as a guard for submit job scheduling. However schedule() ignores the fact that the submit processing was already started for a specific branch and double submit action is scheduled. Specifically for cherry-pick submit strategy that cannot end good and fails with database constraints violation or similar, depending on the underlying database implementation. Guard the background scheduling similar to the UI scheduling. Defining unique index prevents the database corruption: [1], [2] but not the collision between manual and background merge jobs. [1] http://paste.openstack.org/show/83883 [2] http://paste.openstack.org/show/83888 Bug: issue 2034 Bug: issue 2383 Bug: issue 2702 Change-Id: I5b23f9d481351280e26412b82b525947338d9c00 (cherry picked from commit f26fdb499b26a2c02251546a7bb19703cc6c8bba) Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Ismo Haataja <ismo.haataja@digia.com>
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java6
1 files changed, 4 insertions, 2 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
index 12219e23cf..e067d8ee8f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ChangeMergeQueue.java
@@ -147,9 +147,11 @@ public class ChangeMergeQueue implements MergeQueue {
if (e == null) {
e = new MergeEntry(branch);
active.put(branch, e);
+ e.needMerge = true;
+ scheduleJob(e);
+ } else {
+ e.needMerge = true;
}
- e.needMerge = true;
- scheduleJob(e);
}
@Override