{"record":{"id":"ecf9a051872973f5","repo":"astrid-runtime/astrid","slug":"fuse-mount-completed-but-is-absent-from-the-linux","errorCode":null,"errorMessage":"FUSE mount completed but is absent from the Linux mount table","messagePattern":"FUSE mount completed but is absent from the Linux mount table","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fuse/src/filesystem.rs","lineNumber":65,"sourceCode":"    };\n    let mut config = Config::default();\n    config.mount_options = vec![\n        MountOption::FSName(info.volume_name),\n        MountOption::Subtype(\"astrid\".to_owned()),\n        mount_option,\n        MountOption::DefaultPermissions,\n        MountOption::NoDev,\n        MountOption::NoSuid,\n        MountOption::NoExec,\n    ];\n    config.acl = SessionACL::Owner;\n    config.n_threads = Some(1);\n    config.clone_fd = false;\n    let session = Session::new(filesystem, mountpoint, &config)\n        .with_context(|| format!(\"mount Astrid FUSE filesystem at {}\", mountpoint.display()))?;\n    let background = session.spawn()?;\n    if !crate::mountpoint::mountinfo_contains(mountpoint)? {\n        bail!(\"FUSE mount completed but is absent from the Linux mount table\");\n    }\n    Ok(background)\n}\n\n/// FUSE filesystem bound to one immutable owner, access mode, and lease token.\npub(crate) struct AstridFuseFilesystem {\n    callback: CallbackClient,\n    inodes: Mutex<InodeTable>,\n    read_only: bool,\n    uid: u32,\n    gid: u32,\n}\n\nimpl AstridFuseFilesystem {\n    pub(crate) fn new(lease: StorageMountLeaseV1) -> Self {\n        let read_only = lease.access == StorageProviderAccessV1::ReadOnly;\n        let (uid, gid) = owner_ids();\n        let mut inodes = InodeTable::default();","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fuse/src/filesystem.rs#L47-L83","documentation":"This error means the fuser `Session` was created and spawned successfully, but a follow-up check against the Linux mount table (/proc/mounts via `mountinfo_contains`) could not find the mountpoint. The library treats a mount that the kernel mount table does not acknowledge as failed, because unmounted-but-spawned sessions would silently serve nothing. It is thrown from `start_session` in crates/astrid-storage-provider-fuse/src/filesystem.rs:65 right after `session.spawn()`.","triggerScenarios":"Calling `start_session` on Linux where `Session::spawn` returns Ok but `crate::mountpoint::mountinfo_contains(mountpoint)` returns false — the kernel never registered the FUSE mount at that path.","commonSituations":"FUSE kernel module not loaded (/dev/fuse unavailable or fuser falling back oddly); the mountpoint raced away or was replaced between mount and the mountinfo check; container environments without FUSE privileges where fuser reports success spuriously; stale /proc/mounts visibility inside namespaces.","solutions":["Verify the environment supports FUSE: /dev/fuse exists and the fuse kernel module is loaded (modprobe fuse).","Check the mountpoint still exists and is the same inode between mount and verification.","Run outside restricted containers or grant the container FUSE capabilities (--device /dev/fuse, CAP_SYS_ADMIN as needed).","Check /proc/mounts and kernel logs (dmesg) for the fuse mount entry and any mount errors."],"exampleFix":"// environment check before mounting\n// before\nlet bg = start_session(fs, &mp)?;\n// after\nif !Path::new(\"/dev/fuse\").exists() {\n    bail!(\"FUSE unavailable: /dev/fuse missing\");\n}\nlet bg = start_session(fs, &mp)?;","handlingStrategy":"validation","validationCode":"if !Path::new(\"/dev/fuse\").exists() {\n    return Err(anyhow!(\"FUSE unavailable: /dev/fuse missing\"));\n}\nif !mountpoint.exists() { return Err(anyhow!(\"mountpoint missing\")); }","typeGuard":null,"tryCatchPattern":"match start_session(fs, &mp) {\n    Err(e) if e.to_string().contains(\"absent from the Linux mount table\") => {\n        // check /dev/fuse, container privileges, remount\n    }\n    r => r?,\n}","preventionTips":["Verify /dev/fuse and the fuse kernel module exist before mounting","Grant FUSE privileges in containers (--device /dev/fuse)","Re-read /proc/mounts if mount table visibility lags; avoid racing mountpoint removal"],"tags":["fuse","linux","mount","filesystem"],"backgroundTag":"unsupported-platform","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}