hashicorp/nomad · error

error opening root dir %q: %w

Error message

error opening root dir %q: %w

What it means

Remove deletes an existing FIFO at a given path, opening its parent directory with os.OpenRoot first so the unlink happens safely relative to that directory. This error is returned when opening that parent directory fails, typically ENOENT or EACCES, meaning the removal could not even be attempted.

Source

Thrown at client/lib/fifo/fifo_unix.go:76

	}
	defer root.Close()

	// also uses O_NOFOLLOW under the hood
	f, err := root.OpenFile(base, os.O_WRONLY, 0)
	if err != nil {
		return nil, fmt.Errorf("error opening writer at %s: %w", path, err)
	}
	return f, nil
}

// Remove a fifo that already exists at a given path
func Remove(path string) error {
	dir := filepath.Dir(path)
	base := filepath.Base(path)

	root, err := os.OpenRoot(dir)
	if err != nil {
		return fmt.Errorf("error opening root dir %q: %w", dir, err)
	}
	defer root.Close()

	return root.Remove(base)
}

func IsClosedErr(err error) bool {
	err2, ok := err.(*os.PathError)
	if ok {
		return err2.Err == os.ErrClosed
	}
	return false
}

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Treat ENOENT as success in cleanup paths (errors.Is(err, fs.ErrNotExist) → ignore)
  2. Verify the parent directory exists before calling Remove, or skip removal
  3. Check directory permissions for the removing user
  4. Correct the configured FIFO path

Example fix

// before
err := fifo.Remove("/run/containerd/io/stdout")
// after
if err := fifo.Remove("/run/containerd/io/stdout"); err != nil && !errors.Is(err, fs.ErrNotExist) {
	return err
}
Defensive patterns

Strategy: try-catch

Validate before calling

if fi, err := os.Stat(filepath.Dir(path)); err != nil || !fi.IsDir() {
	// skip removal; nothing to clean
}

Try / catch

if err := fifo.Remove(path); err != nil && !errors.Is(err, fs.ErrNotExist) {
	return err
}

Prevention

When it happens

Trigger: Calling fifo.Remove(path) when filepath.Dir(path) does not exist, the process lacks search/write permission on the directory, or the directory path is wrong/unmounted.

Common situations: Idempotent cleanup code calling Remove on cleanup paths whose parent directories were already deleted; wrong configured path; permission changes after container teardown.

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/072709ffeb38c44f. Report an issue: GitHub.