astrid-runtime/astrid · error

detached FUSE service readiness failed [{code}]: {message}

Error message

detached FUSE service readiness failed [{code}]: {message}

What it means

This error means the detached FUSE service reported a `ControlResponse::Failure` during its readiness probe, carrying the service's own error `code` and `message`. The provider surfaces those fields verbatim so the underlying service-side failure is visible to the caller. It is thrown from the readiness validation helper in main.rs:343.

Source

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

                control_path,
                &launch.mountpoint,
                launch.auto_created_mountpoint,
            )
        },
    )
}

fn require_ready_control_response(
    response: ControlResponse,
    expected_access: StorageProviderAccessV1,
) -> Result<()> {
    match response {
        ControlResponse::Status { access } if access == expected_access => Ok(()),
        ControlResponse::Status { access } => {
            bail!("detached FUSE service readiness access {access:?} does not match its lease")
        },
        ControlResponse::Failure { code, message } => {
            bail!("detached FUSE service readiness failed [{code}]: {message}")
        },
        ControlResponse::Done => {
            bail!("detached FUSE service returned an incompatible readiness response")
        },
    }
}

async fn sync(
    client: &mut AdminClient,
    acting_principal: &astrid_core::PrincipalId,
    selector: &StorageMountSelectorV1,
) -> Result<StorageProviderSuccessV1> {
    let record = registry::resolve_record(selector)?;
    let status = require_live_lease(client, acting_principal, &record).await?;
    validate_record(&record, &status)?;
    let control = live_control_status(client, acting_principal, &record).await?;
    match control {
        ControlResponse::Status { access } if access == record.access => {},

View on GitHub (pinned to affd8760f4)

Solutions

  1. Read the embedded `code` and `message` in the error text — they identify the actual service-side fault.
  2. Fix the root cause on the service (mount prerequisites, lease validity, paths) and retry readiness.
  3. Ensure the service binary and the provider are the same version so failure codes are interpretable.
  4. Check service logs/stderr from the detached process for the full failure trace.
Defensive patterns

Strategy: try-catch

Type guard

fn is_failure(resp: &ControlResponse) -> Option<(&str, &str)> {
    match resp { ControlResponse::Failure { code, message } => Some((code, message)), _ => None }
}

Try / catch

match validate_readiness(resp, &lease.access) {
    Err(e) if e.to_string().contains("readiness failed [") => {
        // parse [code] from message, address service-side root cause, retry
    }
    r => r?,
}

Prevention

When it happens

Trigger: The readiness check receives `ControlResponse::Failure { code, message }` instead of `Status` — the service itself failed during startup or when answering the control request.

Common situations: Service failed to mount (missing /dev/fuse, permissions); service-side validation rejected the lease; internal service error like a bad path or resource exhaustion; the message text usually names the root cause.

Related errors


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