xai-org/grok-build · error

{} is still a mountpoint without a grove marker; refusing um

Error message

{} is still a mountpoint without a grove marker; refusing umount/rm

What it means

If the daemon is unreachable, remove_nfs_worktree falls back to manual unmounting. It will only umount a dest that currently is a mountpoint AND has a grove marker tying it to a known worktree. A mountpoint without a marker cannot be proven to be a grove worktree, so umount/rm is refused to avoid unmounting or deleting unrelated filesystems.

Source

Thrown at crates/codegen/xai-fast-worktree/src/nfs/remove.rs:48

    } else if dest_is_mountpoint(worktree_path) || lookup_nfs_meta(worktree_path).is_none() {
        return Ok(None);
    }
    remove_nfs_worktree(worktree_path)
}
fn remove_nfs_worktree(worktree_path: &Path) -> Result<Option<RemoveReport>> {
    let opts = nfs_opts_from_env_and_meta(None);
    let client = NfsWorktreeClient::from_opts(&opts);
    if client.ping() {
        match client.remove_worktree(worktree_path, false) {
            Ok(()) => return report_after_daemon_unmount(worktree_path),
            Err(e) => {
                bail!("daemon RemoveWorktree failed: {e}");
            }
        }
    }
    if dest_is_mountpoint(worktree_path) {
        if lookup_from_markers(worktree_path).is_none() {
            bail!(
                "{} is still a mountpoint without a grove marker; refusing umount/rm",
                worktree_path.display()
            );
        }
        plain_umount(worktree_path)?;
    }
    if !super::dest_is_known_unmounted(worktree_path) {
        bail!(
            "unmount of {} could not be verified (still mounted or mount table \
             inconclusive); retaining backing and pin",
            worktree_path.display()
        );
    }
    let meta = lookup_nfs_meta(worktree_path);
    if let Some(m) = meta.as_ref() {
        let Some(id) = m.worktree_id.as_deref() else {
            bail!(
                "unmounted dest {} has grove metadata without a worktree id; \

View on GitHub (pinned to bc7f02eddd)

Solutions

  1. Restart the grove daemon so the primary RemoveWorktree path (which knows the mapping) can run
  2. Manually verify the mount is yours (compare source/target in `mount` output) and umount by hand, then remove the backing dir
  3. Regenerate/repair marker metadata via grove tooling before retrying

Example fix

// before
try_nfs_remove(&path)?; // fails: daemon down, no marker
// after
Command::new("umount").arg(&path).status()?; // after verifying mount ownership
std::fs::remove_dir_all(&path)?;
Defensive patterns

Strategy: validation

Validate before calling

if dest_is_mountpoint(&path) && lookup_from_markers(&path).is_none() {
    eprintln!("refusing: mountpoint has no grove marker; verify ownership and umount manually");
}

Prevention

When it happens

Trigger: Daemon is down and try_nfs_remove hits the fallback: the path is a mountpoint but lookup_from_markers returns None — mount created outside the tool, markers deleted, or the dest is someone else's mount (e.g. NFS export or loop mount not owned by grove).

Common situations: Daemon crashed mid-lifecycle leaving a mount whose marker was never written; user manually mounted something at the worktree path; stale markers cleaned from disk while the mount remained.

Related errors


AI-assisted analysis of xai-org/grok-build@bc7f02eddd (2026-08-31). Data as JSON: /api/errors/c81d1495bb886e4e. Report an issue: GitHub.