timer: skip projects not using the pipeline

This change makes the timer driver skip projects that are not configured
to use the timer triggered pipeline. Timer operates on branch heads and
doesn't need speculative layouts to decide if it should be enqueued or not.
So it can be decided on cached data if it needs to run or not.

Change-Id: I410c0da5057727734ac82ce56cad75655a9ebc40
This commit is contained in:
Tristan Cacqueray 2018-07-11 02:50:51 +00:00
parent d09e46e91a
commit 6e1b442669
4 changed files with 31 additions and 1 deletions

View File

@ -0,0 +1,6 @@
---
fixes:
- |
The timer trigger does not enqueue an event for every branch of every
project anymore and it now only processes projects actually using the
pipeline triggered by a timer.

View File

@ -39,6 +39,12 @@
label: ubuntu-xenial
run: playbooks/project-bitrot.yaml
- project:
name: org/project1
check:
jobs:
- project-test1
- project:
name: org/project
check:

View File

@ -3375,6 +3375,18 @@ class TestScheduler(ZuulTestCase):
self.assertEqual(len(self.builds), 2)
merge_count_project1 = 0
for job in self.gearman_server.jobs_history:
if job.name == b'merger:refstate':
args = job.arguments
if isinstance(args, bytes):
args = args.decode('utf-8')
args = json.loads(args)
if args["items"][0]["project"] == "org/project1":
merge_count_project1 += 1
self.assertEquals(merge_count_project1, 0,
"project1 shouldn't have any refstate call")
self.executor_server.hold_jobs_in_build = False
# Stop queuing timer triggered jobs so that the assertions
# below don't race against more jobs being queued.

View File

@ -79,7 +79,13 @@ class TimerDriver(Driver, TriggerInterface):
jobs.append(job)
def _onTrigger(self, tenant, pipeline_name, timespec):
for project_name in tenant.layout.project_configs.keys():
for project_name, pcs in tenant.layout.project_configs.items():
# timer operates on branch heads and doesn't need speculative
# layouts to decide if it should be enqueued or not.
# So it can be decided on cached data if it needs to run or not.
if not [True for pc in pcs if pipeline_name in pc.pipelines]:
continue
(trusted, project) = tenant.getProject(project_name)
for branch in project.source.getProjectBranches(project, tenant):
event = TimerTriggerEvent()