Hashar has submitted this change and it was merged.

Change subject: Update merge status after merge:merge is submitted
......................................................................


Update merge status after merge:merge is submitted

When preparing a reference, we set the merge state to PENDING before
having emitted the merge:merge.  If any exception occurs when submitting
the merge:merge job, the buildset is left PENDING and is never retried
because prepareRef early exit in such case.

Move the merge_state change after the job has been submitted. An
exception would let the state as is (ie NEW) and thus indicate it should
be retried.

prepareRef happens before processing jobs and we do not have a way to
pause the scheduler.  So I overrided the merger.submitJob() to throw an
exception, the scheduler keep processing until the event fail.  From
there we can assert the merge is still pending (BuildSet.NEW) then
resume the submitJob() method to clear the queue properly.

I ran the test with the change, and it fails properly (there is still a
change stuck in queue).

Closes-Bug: #1358517
Change-Id: I4d91a15aaae878ed231d50ab5f4f7a65f0d0e830
---
M tests/test_scheduler.py
M zuul/scheduler.py
2 files changed, 32 insertions(+), 1 deletion(-)



diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index 89056f4..43a5e79 100755
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -23,9 +23,11 @@
 import urllib
 import urllib2
 
+import gear
 import git
 import testtools
 
+import zuul.model
 import zuul.scheduler
 import zuul.rpcclient
 import zuul.reporter.gerrit
@@ -1677,6 +1679,35 @@
         self.assertEqual(self.countJobResults(self.history, 'RUN_ERROR'), 1)
         self.assertEqual(self.countJobResults(self.history, 'SUCCESS'), 3)
 
+    def test_retry_merge_on_gearman_error(self):
+        "Test merge:merge is reenqueued on Gearman server error"
+
+        # Instruct merger to fail with a Gearman error
+        def fake_not_connected_error(*args):
+            raise gear.NoConnectedServersError("Fake no connected Gearman 
servers")
+        old_submit_job = self.sched.merger.submitJob
+        self.sched.merger.submitJob = fake_not_connected_error
+
+        self.worker.hold_jobs_in_build = True
+
+        A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+        A.addApproval('CRVW', 2)
+        self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
+        self.waitUntilSettled()
+
+        items = self.sched.layout.pipelines['gate'].getAllItems()
+        self.assertEquals(1, len(items))
+        build_sets = items[0].build_sets
+        self.assertEquals(1, len(build_sets))
+        self.assertEquals(zuul.model.BuildSet.NEW, build_sets[0].merge_state,
+                          "BuildSet merge state must be NEW after failling to "
+                          "prepare a ref")
+
+        # Clear the queue
+        self.sched.merger.submitJob = old_submit_job
+        self.worker.hold_jobs_in_build = False
+        self.worker.release()
+
     def test_statsd(self):
         "Test each of the statsd methods used in the scheduler"
         import extras
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index 1a9e714..74b6b6e 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -1220,7 +1220,6 @@
             return True
         if build_set.merge_state == build_set.PENDING:
             return False
-        build_set.merge_state = build_set.PENDING
         ref = build_set.ref
         if hasattr(item.change, 'refspec') and not ref:
             self.log.debug("Preparing ref for: %s" % item.change)
@@ -1238,6 +1237,7 @@
             self.sched.merger.updateRepo(item.change.project.name,
                                          url, build_set,
                                          self.pipeline.precedence)
+        build_set.merge_state = build_set.PENDING
         return False
 
     def _launchJobs(self, item, jobs):

-- 
To view, visit https://gerrit.wikimedia.org/r/195282
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I4d91a15aaae878ed231d50ab5f4f7a65f0d0e830
Gerrit-PatchSet: 6
Gerrit-Project: integration/zuul
Gerrit-Branch: patch-queue/debian/precise-wikimedia
Gerrit-Owner: Hashar <has...@free.fr>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to