From 3d2f7a7373c8f421fd633c205d3ce245eebc9322 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Thu, 23 Jan 2014 11:07:42 -0800 Subject: [PATCH] Allow zuul to cleanup jobs outside window Zuul's new rate limiting feature would ignore jobs started that are later moved outside the window (due to the window shrinking). Zuul properly dealt with this jobs and changes when they slid back into the window but it did so inefficiently. Go back to processing the entire queue but check if each individual item is actionable before preparing refs on it or starting jobs. Change-Id: Ib76a68f9023652205003e0d164a78b8f67956adf --- zuul/layoutvalidator.py | 2 +- zuul/model.py | 6 +++--- zuul/scheduler.py | 11 ++++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/zuul/layoutvalidator.py b/zuul/layoutvalidator.py index de1aec4d53..64969115b1 100644 --- a/zuul/layoutvalidator.py +++ b/zuul/layoutvalidator.py @@ -60,7 +60,7 @@ class LayoutSchema(object): 'subject': str, }, } - window = v.All(int, v.Range(min=1)) + window = v.All(int, v.Range(min=0)) window_floor = v.All(int, v.Range(min=1)) window_type = v.Any('linear', 'exponential') window_factor = v.All(int, v.Range(min=1)) diff --git a/zuul/model.py b/zuul/model.py index 904e8f3516..d371405816 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -461,11 +461,11 @@ class ChangeQueue(object): self.window = min(self.window, other.window) # TODO merge semantics - def getActionableItems(self): + def isActionable(self, item): if self.dependent and self.window: - return self.queue[:self.window] + return item in self.queue[:self.window] else: - return self.queue[:] + return True def increaseWindowSize(self): if self.dependent: diff --git a/zuul/scheduler.py b/zuul/scheduler.py index 7ca1e35cb2..4a8e7ae67d 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -1149,10 +1149,11 @@ class BasePipelineManager(object): change_queue.moveItem(item, nnfi) changed = True self.cancelJobs(item) - self.prepareRef(item) - if item.current_build_set.unable_to_merge: - failing_reasons.append("it has a merge conflict") - if self.launchJobs(item): + if change_queue.isActionable(item): + self.prepareRef(item) + if item.current_build_set.unable_to_merge: + failing_reasons.append("it has a merge conflict") + if change_queue.isActionable(item) and self.launchJobs(item): changed = True if self.pipeline.didAnyJobFail(item): failing_reasons.append("at least one job failed") @@ -1183,7 +1184,7 @@ class BasePipelineManager(object): for queue in self.pipeline.queues: queue_changed = False nnfi = None # Nearest non-failing item - for item in queue.getActionableItems(): + for item in queue.queue[:]: item_changed, nnfi = self._processOneItem(item, nnfi) if item_changed: queue_changed = True