diff options
Diffstat (limited to 'src/fake_monitor.cc')
| -rw-r--r-- | src/fake_monitor.cc | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/fake_monitor.cc b/src/fake_monitor.cc index a444476..336ad9c 100644 --- a/src/fake_monitor.cc +++ b/src/fake_monitor.cc @@ -83,6 +83,40 @@ public: observers_.remove(observer); } +#if FAKE_MONITOR + void toggle_fakes() override { + if (timer_) { + looper_->cancel(timer_); + timer_ = 0; + +#if 0 + remove_jobs((jobs_.size() * 3) / 4); +#else + auto index = rand() % machines_.size(); + auto it = machines_.begin(); + while (index--) ++it; + auto id = it->first; + machines_.erase(it); + auto jit = jobs_.begin(); + while (jit != jobs_.end()) { + if (jit->second.worker == id) { + jit = jobs_.erase(jit); + } else { + ++jit; + } + } + auto observer = observers_.first(); + while (observer) { + observer->removed_machine(this, id); + observer = observers_.next(); + } +#endif + } else { + schedule_jobs(); + } + } +#endif + private: struct Job { uint32_t const host; @@ -145,10 +179,7 @@ private: std::placeholders::_2)); } - void fiddle_jobs(Looper*, uint32_t) { - timer_ = 0; - - auto remove = !jobs_.empty() ? rand() % jobs_.size() : 0; + void remove_jobs(size_t remove) { while (remove--) { auto it = jobs_.begin(); auto job = it->second; @@ -160,6 +191,12 @@ private: observer = observers_.next(); } } + } + + void fiddle_jobs(Looper*, uint32_t) { + timer_ = 0; + + remove_jobs(!jobs_.empty() ? rand() % jobs_.size() : 0); auto avail = (max_jobs_ * 7) / 8 - jobs_.size(); auto add = avail ? rand() % avail : 0; |
