fn update_params()

in rd-agent/src/hashd.rs [67:166]


    fn update_params(&mut self, knobs: &HashdKnobs, cmd: &HashdCmd, frac: f64) -> Result<()> {
        self.lat_target_pct = cmd.lat_target_pct;
        self.rps_max = ((knobs.rps_max as f64 * frac).round() as u32).max(1);
        let rps_target = ((self.rps_max as f64 * cmd.rps_target_ratio).round() as u32).max(1);

        let mem_frac = match cmd.mem_ratio {
            Some(v) => v,
            None => knobs.mem_frac,
        };

        let file_addr_stdev = match cmd.file_addr_stdev {
            Some(v) => v,
            None => rd_hashd_intf::Params::default().file_addr_stdev_ratio,
        };
        let anon_addr_stdev = match cmd.anon_addr_stdev {
            Some(v) => v,
            None => rd_hashd_intf::Params::default().anon_addr_stdev_ratio,
        };

        let mut params = match rd_hashd_intf::Params::load(&self.params_path) {
            Ok(v) => v,
            Err(e) => {
                info!(
                    "hashd: Failed to load {:?} ({:?}), using default",
                    &self.params_path, &e
                );
                rd_hashd_intf::Params::default()
            }
        };
        let mut changed = false;

        if params.file_size_mean != knobs.hash_size {
            params.file_size_mean = knobs.hash_size;
            changed = true;
        }
        if params.lat_target_pct != self.lat_target_pct {
            params.lat_target_pct = self.lat_target_pct;
            changed = true;
        }
        if params.lat_target != cmd.lat_target {
            params.lat_target = cmd.lat_target;
            changed = true;
        }
        if params.rps_max != self.rps_max {
            params.rps_max = self.rps_max;
            changed = true;
        }
        if params.rps_target != rps_target {
            params.rps_target = rps_target;
            changed = true;
        }
        if params.mem_frac != mem_frac {
            params.mem_frac = mem_frac;
            changed = true;
        }
        if params.chunk_pages != knobs.chunk_pages {
            params.chunk_pages = knobs.chunk_pages;
            changed = true;
        }
        if params.file_addr_stdev_ratio != file_addr_stdev {
            params.file_addr_stdev_ratio = file_addr_stdev;
            changed = true;
        }
        if params.anon_addr_stdev_ratio != anon_addr_stdev {
            params.anon_addr_stdev_ratio = anon_addr_stdev;
            changed = true;
        }
        if params.file_frac != cmd.file_ratio {
            params.file_frac = cmd.file_ratio;
            changed = true;
        }
        if params.log_bps != cmd.log_bps {
            params.log_bps = cmd.log_bps;
            changed = true;
        }
        if params.fake_cpu_load != knobs.fake_cpu_load {
            params.fake_cpu_load = knobs.fake_cpu_load;
            changed = true;
        }

        if changed {
            info!(
                "hashd: Updating {:?} to lat={:.2}ms@{:.2}% rps={:.2} mem={:.2}% log={:.2}Mbps frac={:.2}",
                AsRef::<Path>::as_ref(&self.params_path)
                    .parent()
                    .unwrap()
                    .file_name()
                    .unwrap(),
                cmd.lat_target * TO_MSEC,
                cmd.lat_target_pct * TO_PCT,
                rps_target,
                mem_frac * TO_PCT,
                to_mb(cmd.log_bps),
                frac
            );
            params.save(&self.params_path)?;
        }

        Ok(())
    }