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
- Read the embedded `code` and `message` in the error text — they identify the actual service-side fault.
- Fix the root cause on the service (mount prerequisites, lease validity, paths) and retry readiness.
- Ensure the service binary and the provider are the same version so failure codes are interpretable.
- 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
- Capture and inspect service stderr/logs from the detached process
- Pre-validate the lease and mountpoint before starting the service
- Ensure /dev/fuse and mount privileges are available to the service
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
- detached FUSE service readiness access {access:?} does not m
- detached FUSE service returned an incompatible readiness res
- FUSE service unmount failed [{code}]: {message}
- opaque capsule assets cannot be symlinks: {}
- daemon workspace metadata was not available within {timeout_
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/a6d88f779b46ff1d.
Report an issue: GitHub.