astrid-runtime/astrid · error

FUSE service mountpoint overlaps the lease resource

Error message

FUSE service mountpoint overlaps the lease resource

What it means

validate_mountpoint rejects any mountpoint that equals the lease resource_path, lies under it, or contains it. Mounting FUSE over the directory that holds the lease manifest (or nesting the two) would shadow or corrupt the lease data the service itself needs, so the launch is aborted.

Solutions

  1. Choose a mountpoint path that is fully disjoint from the lease resource_path (neither is a prefix of the other)
  2. Use separate directory conventions, e.g. /run/astrid/leases/<id> for resource_path and /run/astrid/mounts/<id> for the mountpoint
  3. Review generated config so path templating cannot yield the same base directory for both fields

Example fix

// before
resource_path = /run/astrid/leases/demo
mountpoint    = /run/astrid/leases/demo/mnt  // overlaps

// after
resource_path = /run/astrid/leases/demo
mountpoint    = /run/astrid/mounts/demo
Defensive patterns

Strategy: validation

Validate before calling

let m = std::path::absolute(mountpoint)?;
let r = std::path::absolute(resource_path)?;
if m == r || m.starts_with(&r) || r.starts_with(&m) { /* pick a disjoint path */ }

Prevention

When it happens

Trigger: Calling validate_launch where mountpoint == resource_path, mountpoint.starts_with(resource_path), or resource_path.starts_with(mountpoint) — i.e. the mount target and the lease directory overlap.

Common situations: Configuring both the lease directory and the mountpoint to the same path (e.g. /run/astrid/leases/x for both); nesting the mountpoint inside the lease directory; pointing resource_path at an existing user mount directory by mistake.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


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

Appendix: source

Thrown at crates/astrid-storage-provider-fuse/src/service.rs:256

        bail!("FUSE launch lease does not match the kernel manifest");
    }
    Ok(())
}

fn validate_mountpoint(mountpoint: &Path, resource_path: &Path) -> Result<()> {
    if !mountpoint.is_absolute()
        || mountpoint
            .components()
            .any(|component| matches!(component, std::path::Component::ParentDir))
        || mountpoint.parent().is_none()
    {
        bail!("FUSE service mountpoint is malformed");
    }
    if mountpoint == resource_path
        || mountpoint.starts_with(resource_path)
        || resource_path.starts_with(mountpoint)
    {
        bail!("FUSE service mountpoint overlaps the lease resource");
    }
    platform_fs::validate_private_directory(mountpoint)
        .context("validate private FUSE service mountpoint")?;
    platform_fs::verify_no_redirects(mountpoint)
        .context("reject redirected FUSE service mountpoint")?;
    if std::fs::read_dir(mountpoint)?.next().is_some() {
        bail!("FUSE service mountpoint is not empty");
    }
    if mountpoint::mountinfo_contains(mountpoint)? {
        bail!("FUSE service mountpoint is already mounted");
    }
    Ok(())
}

fn validate_control_path(control_path: &Path, resource_path: &Path) -> Result<()> {
    if !control_path.is_absolute()
        || control_path
            .components()

View on GitHub (pinned to affd8760f4)