fn stream_send_deadline() -> std::time::Duration {
static MS: std::sync::OnceLock<u64> = std::sync::OnceLock::new();
std::time::Duration::from_millis(*MS.get_or_init(|| {
std::env::var("METRALE_STREAM_SEND_DEADLINE_MS")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(5000)
}))
}
pub(in crate::scheduler) fn bounded_stream_send(
tx: &tokio::sync::mpsc::Sender<crate::api::inference_types::StreamEvent>,
event: crate::api::inference_types::StreamEvent,
what: &str,
) -> bool {
use tokio::sync::mpsc::error::TrySendError;
let mut event = match tx.try_send(event) {
Ok(()) => return true,
Err(TrySendError::Closed(_)) => {
tracing::info!("stream receiver dropped — client went away ({what})");
return false;
}
Err(TrySendError::Full(ev)) => ev,
};
let deadline = std::time::Instant::now() + stream_send_deadline();
loop {
std::thread::sleep(std::time::Duration::from_millis(1));
match tx.try_send(event) {
Ok(()) => return true,
Err(TrySendError::Closed(_)) => {
tracing::info!(
"stream receiver dropped during backpressure — client went away ({what})"
);
return false;
}
Err(TrySendError::Full(ev)) => {
if std::time::Instant::now() >= deadline {
tracing::warn!(
"stream consumer stalled past {:?} with a full channel — abandoning ({what})",
stream_send_deadline()
);
return false;
}
event = ev;
}
}
}
}
static RUNTIME_HANDLE: std::sync::OnceLock<tokio::runtime::Handle> = std::sync::OnceLock::new();
pub fn capture_runtime_handle() {
let _ = RUNTIME_HANDLE.set(tokio::runtime::Handle::current());
}
pub(in crate::scheduler) fn spawn_terminal_send(
tx: &tokio::sync::mpsc::Sender<crate::api::inference_types::StreamEvent>,
event: crate::api::inference_types::StreamEvent,
what: &'static str,
) {
if let Some(h) = RUNTIME_HANDLE.get() {
let tx = tx.clone();
let deadline = stream_send_deadline();
h.spawn(async move {
match tokio::time::timeout(deadline, tx.send(event)).await {
Ok(Ok(())) => {}
Ok(Err(_)) => tracing::debug!("terminal send: receiver dropped ({what})"),
Err(_) => tracing::warn!(
"terminal send: consumer stalled past {deadline:?}, frame dropped ({what})"
),
}
});
} else if !bounded_stream_send(tx, event, what) {
tracing::debug!("terminal send failed synchronously ({what})");
}
}