Instead of just suppressing offers when all work is complete, we set refuse seconds of 2 weeks
(a.k.a. forever) whenever we decline any offer. When we see *new* work (
PodInstanceRequirement
`s) we
assume that the offers we've declined forever may be useful to that work, and so we revive offers.
Pseudo-code algorithm is this:
// We always start out revived
List
oldRequirements = getRequirements();
while (true) {
List currRequirements = getRequirements()
List newRequirements = oldRequirements - currRequirements;
if (newRequirements.isEmpty()) {
print “No new work”;
} else {
oldRequirements = currRequirements;
revive();
}
}
The invariant maintained is that the oldRequirements have always had revive called for them at least once, giving
them access to offers.
This case must work:
kafka-0-broker fails @ 10:30, it's new work!
kafka-0-broker recovers @ 10:35
kafka-0-broker fails @ 11:00, it's new work!
...