astrid-runtime/astrid · error

detached FUSE service exited after readiness

Error message

detached FUSE service exited after readiness: {status}

What it means

Readiness follow-up check in require_service_running_after_handoff: the detached FUSE service process exited after it had reported readiness (status in message), so the mount cannot be considered live and any pending error context is attached.

Solutions

  1. Read the stderr snippet in the error for the crash cause
  2. Retry the mount after fixing the underlying service failure
  3. Check for FUSE kernel/mountpoint problems that kill the service post-handshake
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at crates/astrid-storage-provider-fuse/src/main.rs:664 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/9e9ca8e54e089120. Report an issue: GitHub.

Appendix: source

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

                Ok(Ok(bytes)) => bounded_stderr_snippet(&bytes),
                Ok(Err(_)) | Err(_) => String::new(),
            };
            let status_context = format!("detached FUSE service status: {status:?}");
            if stderr.is_empty() {
                Err(error.context(status_context))
            } else {
                Err(error.context(format!("{status_context}; stderr: {stderr}")))
            }
        },
    }
}

async fn require_service_running_after_handoff(
    child: &mut tokio::process::Child,
) -> Result<()> {
    match child.try_wait() {
        Ok(None) => Ok(()),
        Ok(Some(status)) => bail!("detached FUSE service exited after readiness: {status}"),
        Err(error) => {
            let _ = child.kill().await;
            let status = child.wait().await;
            Err(anyhow::Error::new(error)
                .context("inspect detached FUSE service after stderr sink handoff")
                .context(format!("detached FUSE service status: {status:?}")))
        },
    }
}

async fn read_service_startup(
    child: &mut tokio::process::Child,
    launch: &ServiceLaunch,
    control_path: &Path,
) -> Result<ControlReady> {
    let mut stdin = child
        .stdin
        .take()

View on GitHub (pinned to affd8760f4)