xai-org/grok-build · error
arboard read timed out
Error message
arboard read timed out
What it means
arboard_read_with_deadline (crates/codegen/xai-grok-shared/src/clipboard.rs:1337) runs arboard reads on a worker thread with a timeout because the Wayland data-control read can block forever on a hung selection owner. If the channel recv times out, it abandons the worker and returns this error. The read produced no result within the deadline.
Source
Thrown at crates/codegen/xai-grok-shared/src/clipboard.rs:1337
/// abandoned on expiry. The worker's `Clipboard` instance leaks with it;
/// harmless while the lease keeps the shared backend alive.
const ARBOARD_READ_WAIT: std::time::Duration = std::time::Duration::from_secs(2);
fn arboard_read_with_deadline<T: Send + 'static>(
op: impl FnOnce(&mut arboard::Clipboard) -> anyhow::Result<T> + Send + 'static,
) -> anyhow::Result<T> {
use std::sync::mpsc::RecvTimeoutError;
if arboard_wayland_bypassed() {
anyhow::bail!("arboard leg disabled (GROK_CLIPBOARD_NO_DATA_CONTROL)");
}
let result = spawn_with_deadline("clipboard-read", ARBOARD_READ_WAIT, move || {
arboard::Clipboard::new()
.map_err(anyhow::Error::from)
.and_then(|mut clipboard| op(&mut clipboard))
});
match result {
Ok(inner) => inner,
Err(RecvTimeoutError::Timeout) => Err(anyhow::anyhow!("arboard read timed out")),
Err(RecvTimeoutError::Disconnected) => Err(anyhow::anyhow!("arboard read worker died")),
}
}
fn arboard_get_text() -> anyhow::Result<Option<String>> {
arboard_read_with_deadline(|clipboard| match clipboard.get_text() {
Ok(text) if text.is_empty() => Ok(None),
Ok(text) => Ok(Some(text)),
Err(arboard::Error::ContentNotAvailable) => Ok(None),
Err(err) => Err(err.into()),
})
}
#[cfg(target_os = "linux")]
fn arboard_get_primary_text() -> anyhow::Result<Option<String>> {
use arboard::{GetExtLinux, LinuxClipboardKind};
arboard_read_with_deadline(|clipboard| {
match clipboardView on GitHub (pinned to bc7f02eddd)
Solutions
- Identify and restart the hung selection owner (clipboard manager / compositor).
- Retry the read after the owner recovers; the abandoned worker exits on its own.
- Fall back to CLI readers (wl-paste/xclip/pbpaste) when arboard times out repeatedly.
- On X11 prefer the built-in 4s budget path; on Wayland ensure the data-control protocol is healthy.
Example fix
// before
let text = arboard_get_text()?;
// after
let text = match arboard_get_text() {
Ok(t) => t,
Err(e) if e.to_string().contains("timed out") => cli_read_fallback()?,
Err(e) => return Err(e),
}; Defensive patterns
Strategy: try-catch
Try / catch
match arboard_get_text() {
Err(e) if e.to_string() == "arboard read timed out" => {
// selection owner hung; retry once or use CLI fallback
cli_read_fallback()
}
other => other,
} Prevention
- Restart hung clipboard managers / compositors on affected Wayland boxes.
- Treat timeouts as transient: retry with backoff before failing.
- Keep wl-paste/xclip installed as an alternate read path.
When it happens
Trigger: arboard_get_text, arboard_get_primary_text, arboard_get_image, or get_file_urls while the Wayland/X11 selection owner is hung or extremely slow to answer the paste request.
Common situations: A crashed-but-alive clipboard manager holding the selection on Wayland; remote apps owning the X11 selection over a slow forwarding link.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- arboard leg disabled (GROK_CLIPBOARD_NO_DATA_CONTROL)
- arboard unavailable
- arboard read worker died
- wait failed: {body}
- no clipboard backend available
AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31).
Data as JSON: /api/errors/af01fc7ec6d8d34f.
Report an issue: GitHub.