astrid-runtime/astrid · error

kernel lease metadata does not match the FUSE provider…

Error message

kernel lease metadata does not match the FUSE provider registry

What it means

Consistency check during FUSE unmount: the kernel lease metadata for the mount id disagrees with the provider's local registry record (different mount identity or state), so the unmount cannot safely proceed against a mismatched lease.

Solutions

  1. Re-list mounts to get the current registry state and retry with the correct selector
  2. Clean up the stale registry record if the kernel lease has already been released
  3. Investigate how registry and kernel lease diverged (crash between create steps)
Defensive patterns

Strategy: retry

When it happens

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

Appendix: source

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

        mount_id: record.mount_id,
        mountpoint: record.mountpoint,
        access: record.access,
        dirty: lease_status.dirty,
    })
}

async fn unmount(
    client: &mut AdminClient,
    acting_principal: &astrid_core::PrincipalId,
    selector: &StorageMountSelectorV1,
) -> Result<StorageProviderSuccessV1> {
    let record = registry::resolve_record(selector)?;
    if &record.requested_by != acting_principal {
        bail!("mount was issued to another acting principal");
    }
    let live = if let Some(status) = kernel_lease_status(client, &record.mount_id).await? {
        if status.mountpoint != record.mountpoint || status.access != record.access {
            bail!("kernel lease metadata does not match the FUSE provider registry");
        }
        true
    } else {
        cleanup_stale_record(client, acting_principal, &record).await?;
        false
    };
    if live {
        let control_result = control_unmount(&record.control_path, acting_principal);
        if let Err(error) = control_result {
            eprintln!(
                "falling back to stale FUSE cleanup after control unmount failure: {error:#}"
            );
            cleanup_stale_record(client, acting_principal, &record).await?;
        } else {
            into_success(
                client
                    .request(AdminRequestKind::StorageMountRevoke {
                        mount_id: record.mount_id,

View on GitHub (pinned to affd8760f4)