in src/runtime/failure.rs [82:107]
fn persist_failure_to_file(serialized_schedule: &str, destination: Option<&PathBuf>) -> std::io::Result<PathBuf> {
// Try to find the first usable filename. This is quadratic but we don't expect a ton of
// conflicts here.
let mut i = 0;
let dir = if let Some(dir) = destination {
dir.clone()
} else {
std::env::current_dir()?
};
let (path, mut file) = loop {
let path = dir.clone().join(Path::new(&format!("schedule{:03}.txt", i)));
// `create_new` does the existence check and creation atomically, so this loop ensures that
// two concurrent tests won't try to persist to the same file.
match OpenOptions::new().write(true).create_new(true).open(&path) {
Ok(file) => break (path, file),
Err(e) => {
if e.kind() != ErrorKind::AlreadyExists {
return Err(e);
}
}
}
i += 1;
};
file.write_all(serialized_schedule.as_bytes())?;
path.canonicalize()
}