{"record":{"id":"ed996bcd3d8a2a4a","repo":"astrid-runtime/astrid","slug":"registered-fuse-service-returned-an-incompatible-s","errorCode":null,"errorMessage":"registered FUSE service returned an incompatible status response","messagePattern":"registered FUSE service returned an incompatible status response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fuse/src/main.rs","lineNumber":825,"sourceCode":"    let status = kernel_lease_status(client, &record.mount_id).await?;\n    let Some(status) = status else {\n        cleanup_stale_record(client, acting_principal, &record).await?;\n        return Ok(());\n    };\n    validate_record(&record, &status)?;\n    match call_control(\n        &record.control_path,\n        &ControlRequest::Status {\n            requested_by: record.requested_by.clone(),\n        },\n    ) {\n        Ok(ControlResponse::Status { access }) if access == status.access => {\n            bail!(\"mountpoint is already mounted: {}\", mountpoint.display())\n        },\n        Ok(ControlResponse::Status { access }) => {\n            bail!(\"registered FUSE service access {access:?} does not match its lease\")\n        },\n        Ok(_) => bail!(\"registered FUSE service returned an incompatible status response\"),\n        Err(_) => {\n            cleanup_stale_record(client, acting_principal, &record).await?;\n            Ok(())\n        },\n    }\n}\n\nasync fn cleanup_stale_record(\n    client: &mut AdminClient,\n    acting_principal: &astrid_core::PrincipalId,\n    record: &registry::MountRecord,\n) -> Result<()> {\n    let lease_is_live = kernel_lease_status(client, &record.mount_id)\n        .await?\n        .is_some();\n    let _ = call_control(\n        &record.control_path,\n        &ControlRequest::Unmount {","sourceCodeStart":807,"sourceCodeEnd":843,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fuse/src/main.rs#L807-L843","documentation":"During mount, the FUSE control channel is expected to answer a status probe with a ControlResponse::Status. If the service replies with some other ControlResponse variant (Done, Failure, etc.), the code cannot determine mount state and bails with this message in crates/astrid-storage-provider-fuse/src/main.rs:825.","triggerScenarios":"Sending a status query over the FUSE control socket and receiving a non-Status response — typically because the listening process is not the expected FUSE control service or speaks a different protocol version.","commonSituations":"Protocol/version mismatch between the mount client and a running FUSE service; another program occupies the control socket path; an older service binary that lacks the Status response.","solutions":["Ensure the process on the control socket is the matching-version astrid FUSE service; kill or upgrade it if not","Remove stale socket files left by previous runs and retry the mount","Align client and service versions so ControlResponse semantics match"],"exampleFix":"// before: probing an unknown process on the socket\nlet status = query_status(socket)?; // bails on non-Status reply\n// after\nensure_fuse_service_running(socket)?; // verify the right service owns the socket\nlet status = query_status(socket)?;","handlingStrategy":"type-guard","validationCode":"let ok = matches!(resp, ControlResponse::Status { .. });","typeGuard":"fn as_status(resp: &ControlResponse) -> Option<&Access> { match resp { ControlResponse::Status { access } => Some(access), _ => None } }","tryCatchPattern":"match result { Err(e) if e.to_string().contains(\"incompatible status response\") => restart_fuse_service()?, r => r? }","preventionTips":["Pin client and service to the same version","Check socket ownership before probing","Clean stale sockets at startup"],"tags":["fuse","mount","protocol-mismatch","unexpected-response"],"backgroundTag":"unexpected-response-shape","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"}