juicedata/juicefs · error

read %s: %w

Error message

read %s: %w

What it means

Returned by loadConfig while walking up from a path looking for the JuiceFS .config file: a directory entry named like the config exists but reading it fails with a non-ENOENT error (permission denied, I/O error). The wrapped error identifies the failing directory.

Source

Thrown at cmd/mount_unix.go:165

				return
			}
			logger.Warnf("watchdog: FUSE abort triggered for connection %d, pid %d", conn, pid)
		} else if err != nil {
			logger.Warnf("watchdog: failed to parse waiting FUSE requests for connection %d, pid %d: %v; abort not triggered", conn, pid, err)
		}
	}
}

func loadConfig(path string) (string, *vfs.Config, error) {
	for d := path; d != "/"; d = filepath.Dir(d) {
		data, err := readConfig(d)
		if err == nil {
			var conf vfs.Config
			err = json.Unmarshal(data, &conf)
			return d, &conf, err
		}
		if !os.IsNotExist(err) {
			return "", nil, fmt.Errorf("read %s: %w", d, err)
		}
	}
	return "", nil, fmt.Errorf("%s is not inside JuiceFS", path)
}

func printThreadsStack(pid int) {
	if pid <= 1 {
		return
	}
	start := time.Now()
	tids, err := os.ReadDir(fmt.Sprintf("/proc/%d/task", pid))
	if err != nil {
		logger.Warnf("list tasks of pid %d: %s", pid, err)
		return
	}
	var b strings.Builder
	for _, tid := range tids {
		readThreadStats(pid, tid.Name(), &b)

View on GitHub (pinned to c9a67b23e8)

Solutions

  1. Fix read permissions / I/O issues on the reported path so the .config can be read
  2. Remove the corrupt .config file so the mount recreates it
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at cmd/mount_unix.go:165 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/a2332b517020ae00. Report an issue: GitHub.