in resctl-bench/src/bench/iocost_tune.rs [69:161]
fn parse(sel: &str) -> Result<DataSel> {
match sel.to_lowercase().as_str() {
"mof" => return Ok(Self::MOF),
"amof" => return Ok(Self::AMOF),
"amof-delta" => return Ok(Self::AMOFDelta),
"isol" => return Ok(Self::Isol),
"isol-mean" => return Ok(Self::IsolMean),
"lat-imp" => return Ok(Self::LatImp),
"work-csv" => return Ok(Self::WorkCsv),
"missing" => return Ok(Self::Missing),
_ => {}
}
if sel.starts_with("isol-") {
let pct = &sel[5..];
if pct == "max" {
return Ok(Self::IsolPct("100".to_owned()));
}
for hog_pct in MemHog::PCTS.iter() {
if pct == *hog_pct {
return Ok(Self::IsolPct(pct.to_owned()));
}
}
bail!("Invalid isol pct {}, supported: {:?}", pct, &MemHog::PCTS);
}
let rw = if sel.starts_with("rlat-") {
READ
} else if sel.starts_with("wlat-") {
WRITE
} else {
bail!("unknown data selector {:?}", sel);
};
let pcts: Vec<&str> = sel[5..].split("-").collect();
if pcts.len() == 0 || pcts.len() > 2 {
bail!("unknown data selector {:?}", sel);
}
let mut lat_pct = None;
if pcts[0] == "max" {
lat_pct = Some("100");
} else {
for pct in StudyIoLatPcts::LAT_PCTS.iter() {
if pcts[0] == *pct {
lat_pct = Some(pct);
break;
}
}
}
if lat_pct.is_none() {
bail!(
"latency selector {:?} not one of {} or \"max\"",
pcts[0],
StudyIoLatPcts::LAT_PCTS
.iter()
.map(|x| format!("{:?}", x))
.collect::<Vec<_>>()
.join(", ")
);
}
let mut time_pct = None;
if pcts.len() == 1 || pcts[1] == "mean" {
time_pct = Some("mean");
} else if pcts[1] == "max" {
time_pct = Some("100");
} else {
for pct in StudyIoLatPcts::TIME_PCTS.iter() {
if pcts[1] == *pct {
time_pct = Some(pct);
break;
}
}
}
if time_pct.is_none() {
bail!(
"time selector {:?} not one of {}, \"max\" or \"mean\"",
pcts[1],
StudyIoLatPcts::TIME_PCTS
.iter()
.map(|x| format!("{:?}", x))
.collect::<Vec<_>>()
.join(",")
);
}
Ok(if rw == READ {
Self::RLat(lat_pct.unwrap().to_owned(), time_pct.unwrap().to_owned())
} else {
Self::WLat(lat_pct.unwrap().to_owned(), time_pct.unwrap().to_owned())
})
}