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
diff --git a/zuul/layoutvalidator.py b/zuul/layoutvalidator.py
index de1aec4..6496911 100644
--- a/zuul/layoutvalidator.py
+++ b/zuul/layoutvalidator.py
@@ -60,7 +60,7 @@
'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 904e8f3..d371405 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -461,11 +461,11 @@
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 7ca1e35..4a8e7ae 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -1149,10 +1149,11 @@
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 @@
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