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