astrid-runtime/astrid · error

stale FUSE service was cleaned up after control failure

Error message

stale FUSE service was cleaned up after control failure: {error:#}

What it means

Stale-service handling in live_control_status: the control-socket request to the detached FUSE service failed, so the record was cleaned up and the error reported notes the stale service was reaped — the original control error is embedded as context.

Solutions

  1. Retry the operation — the mount has been cleaned up, so a fresh mount will get a new service
  2. Inspect the embedded control error for the root cause (dead service, socket removed)
  3. Check service logs/stderr for why the detached FUSE process stopped responding
Defensive patterns

Strategy: retry

When it happens

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

Appendix: source

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

        },
    }
}

async fn live_control_status(
    client: &mut AdminClient,
    acting_principal: &astrid_core::PrincipalId,
    record: &registry::MountRecord,
) -> Result<ControlResponse> {
    match call_control(
        &record.control_path,
        &ControlRequest::Status {
            requested_by: acting_principal.clone(),
        },
    ) {
        Ok(response) => Ok(response),
        Err(error) => {
            cleanup_stale_record(client, acting_principal, record).await?;
            bail!("stale FUSE service was cleaned up after control failure: {error:#}")
        },
    }
}

fn failure_response(code: &str, message: &str) -> ControlResponse {
    ControlResponse::Failure {
        code: code.to_owned(),
        message: bounded_failure_message(message),
    }
}

async fn launch_service(launch: &ServiceLaunch, control_path: &Path) -> Result<ControlReady> {
    use std::os::unix::process::CommandExt as _;

    let executable = std::env::current_exe()?;
    let mut command = tokio::process::Command::new(executable);
    command
        .arg(PUBLIC_SERVICE_ARGUMENT)

View on GitHub (pinned to affd8760f4)