summaryrefslogtreecommitdiff
path: root/src/fake_monitor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fake_monitor.cc')
-rw-r--r--src/fake_monitor.cc45
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;