astrid-runtime/astrid · error

detached FUSE service exited before readiness

Error message

detached FUSE service exited before readiness

What it means

Handshake guard in service startup: the detached FUSE service exited before sending its readiness line on stdout (within SERVICE_STARTUP_TIMEOUT), so the launch never completed; stderr is captured as context when available.

Solutions

  1. Inspect the stderr snippet in the error for the early-exit reason
  2. Verify the launch payload schema and provider binary are compatible
  3. Retry the mount once the environment (fusermount, mountpoint) is fixed
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at crates/astrid-storage-provider-fuse/src/main.rs:701 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/f1cdae3ed2809f41. Report an issue: GitHub.

Appendix: source

Thrown at crates/astrid-storage-provider-fuse/src/main.rs:701

        .context("FUSE service stdin is unavailable")?;
    let bytes = serde_json::to_vec(launch)?;
    stdin.write_all(&bytes).await?;
    stdin.write_all(b"\n").await?;
    drop(stdin);
    let stdout = child
        .stdout
        .take()
        .context("FUSE service stdout is unavailable")?;
    let mut line = String::new();
    let reader = tokio::io::BufReader::new(stdout);
    let read = tokio::time::timeout(SERVICE_STARTUP_TIMEOUT, async {
        let mut limited = reader.take(64 * 1024 + 1);
        limited.read_line(&mut line).await
    })
    .await
    .context("timed out waiting for the FUSE service")??;
    if read == 0 {
        bail!("detached FUSE service exited before readiness");
    }
    if line.len() > 64 * 1024 {
        bail!("detached FUSE service exceeded the startup response size");
    }
    match serde_json::from_str(&line)? {
        ServiceStartup::Ready {
            mount_id,
            pid,
            access,
        } => {
            if !control_path.exists() {
                bail!("detached FUSE service did not retain its control endpoint");
            }
            if pid == 0 {
                bail!("detached FUSE service returned an invalid process identity");
            }
            Ok(ControlReady {
                mount_id,

View on GitHub (pinned to affd8760f4)