in rd-agent/src/cmd.rs [233:356]
fn apply_cmd(
&mut self,
removed_sysloads: &mut Vec<Sysload>,
removed_sideloads: &mut Vec<Sideload>,
) -> Result<bool> {
let cmd = &self.sobjs.cmd_file.data;
let bench = &self.sobjs.bench_file.data;
let mut repeat = false;
self.sobjs.cmd_ack_file.data.cmd_seq = cmd.cmd_seq;
if let Err(e) = self.sobjs.cmd_ack_file.commit() {
warn!(
"cmd: Failed to update {:?} ({:?})",
&self.cfg.cmd_ack_path, &e
);
}
self.apply_swappiness(cmd.swappiness)?;
self.apply_zswap_enabled(cmd.zswap_enabled)?;
match self.state {
Idle => {
if cmd.bench_iocost_seq > bench.iocost_seq {
self.bench_iocost = Some(bench::start_iocost_bench(&*self.cfg)?);
self.state = BenchIoCost;
self.force_apply = true;
} else if cmd.bench_hashd_seq > bench.hashd_seq {
if bench.iocost_seq > 0 || self.cfg.force_running {
if let Err(e) = self.balloon.set_size(cmd.bench_hashd_balloon_size) {
error!(
"cmd: Failed to set balloon size to {:.2}G for hashd bench ({:?})",
to_gb(cmd.bench_hashd_balloon_size),
&e
);
panic!();
}
self.sobjs.oomd.stop();
self.bench_hashd = Some(bench::start_hashd_bench(
&*self.cfg,
cmd.hashd[0].log_bps,
0,
cmd.bench_hashd_args.clone(),
)?);
self.hashd_set.mark_bench_start();
self.state = BenchHashd;
self.force_apply = true;
} else if !self.warned_bench {
warn!("cmd: iocost benchmark must be run before hashd benchmark");
self.warned_bench = true;
}
} else if bench.hashd_seq > 0 || self.cfg.force_running {
info!("cmd: Transitioning to Running state");
self.state = Running;
repeat = true;
} else if !self.warned_init {
warn!("cmd: hashd benchmark hasn't been run yet, staying idle");
self.warned_init = true;
}
}
Running => {
if cmd.bench_hashd_seq > bench.hashd_seq || cmd.bench_iocost_seq > bench.iocost_seq
{
self.become_idle();
} else {
if let Err(e) = self.apply_workloads() {
error!("cmd: Failed to apply workload changes ({:?})", &e);
panic!();
}
let side_defs = &self.sobjs.side_def_file.data;
let sysload_target = &self.sobjs.cmd_file.data.sysloads;
if let Err(e) = self.side_runner.apply_sysloads(
sysload_target,
side_defs,
&self.sobjs.bench_file.data,
Some(removed_sysloads),
) {
warn!("cmd: Failed to apply sysload changes ({:?})", &e);
}
let sideload_target = &self.sobjs.cmd_file.data.sideloads;
if let Err(e) = self.side_runner.apply_sideloads(
sideload_target,
side_defs,
&self.sobjs.bench_file.data,
Some(removed_sideloads),
) {
warn!("cmd: Failed to apply sideload changes ({:?})", &e);
}
let balloon_size = ((total_memory() as f64)
* &self.sobjs.cmd_file.data.balloon_ratio)
as usize;
if let Err(e) = self.balloon.set_size(balloon_size) {
error!(
"cmd: Failed to set balloon size to {:.2}G ({:?})",
to_gb(balloon_size),
&e
);
panic!();
}
}
}
BenchHashd => {
if cmd.bench_hashd_seq <= bench.hashd_seq {
info!("cmd: Canceling hashd benchmark");
self.become_idle();
}
}
BenchIoCost => {
if cmd.bench_iocost_seq <= bench.iocost_seq {
info!("cmd: Canceling iocost benchmark");
self.become_idle();
}
}
}
if self.state != Idle {
self.warned_bench = false;
self.warned_init = false;
}
Ok(repeat)
}