use crate::scenario::payload_run::PayloadHandle;
use crate::worker_ready::worker_ready_marker_path;
pub fn wait_for_worker_ready(
worker: &mut PayloadHandle,
worker_pid: u32,
timeout: std::time::Duration,
role: &str,
exit_code_legend: &str,
) -> anyhow::Result<()> {
let ready_path = worker_ready_marker_path(worker_pid);
let deadline = std::time::Instant::now() + timeout;
while !std::path::Path::new(&ready_path).exists() {
if let Some((_, metrics)) = worker.try_wait()? {
anyhow::bail!(
"{role} pid={worker_pid} exited before creating ready marker \
{ready_path} (exit_code={} — see stderr; worker exit codes: \
{exit_code_legend})",
metrics.exit_code,
);
}
if std::time::Instant::now() >= deadline {
anyhow::bail!(
"{role} pid={worker_pid} did not create ready marker {ready_path} \
within {timeout:?}",
);
}
std::thread::sleep(std::time::Duration::from_millis(10));
}
if let Some((_, metrics)) = worker.try_wait()? {
anyhow::bail!(
"{role} pid={worker_pid} exited after writing ready marker but \
before the caller's next dispatch (exit_code={} — see stderr)",
metrics.exit_code,
);
}
Ok(())
}