hydra-evaluator: make the logic of the scheduler easier to read

This commit is contained in:
Graham Christensen 2020-03-03 18:17:21 -05:00
parent eb5873ae53
commit eaa65f51f4
No known key found for this signature in database
GPG key ID: FE918C3A98C1030F

View file

@ -129,19 +129,42 @@ struct Evaluator
childStarted.notify_one(); childStarted.notify_one();
} }
bool shouldEvaluate(Jobset & jobset)
{
if (jobset.pid != -1) {
// Already running.
return false;
}
if (jobset.triggerTime == std::numeric_limits<time_t>::max()) {
// An evaluation of this Jobset is requested
return true;
}
if (jobset.checkInterval <= 0) {
// Automatic scheduling is disabled. We allow requested
// evaluations, but never schedule start one.
return false;
}
if (jobset.lastCheckedTime + jobset.checkInterval <= time(0)) {
// Time to schedule a fresh evaluation
return true;
}
return false;
}
void startEvals(State & state) void startEvals(State & state)
{ {
std::vector<Jobsets::iterator> sorted; std::vector<Jobsets::iterator> sorted;
time_t now = time(0);
/* Filter out jobsets that have been evaluated recently and have /* Filter out jobsets that have been evaluated recently and have
not been triggered. */ not been triggered. */
for (auto i = state.jobsets.begin(); i != state.jobsets.end(); ++i) for (auto i = state.jobsets.begin(); i != state.jobsets.end(); ++i)
if (evalOne || if (evalOne ||
(i->second.pid == -1 && (i->second.evaluation_style && shouldEvaluate(i->second)))
(i->second.triggerTime != std::numeric_limits<time_t>::max() ||
(i->second.checkInterval > 0 && i->second.lastCheckedTime + i->second.checkInterval <= now))))
sorted.push_back(i); sorted.push_back(i);
/* Put jobsets in order of ascending trigger time, last checked /* Put jobsets in order of ascending trigger time, last checked