gastownhall/beads · error

inspect quarantine target %s: %w

Error message

inspect quarantine target %s: %w

What it means

quarantineRecord probes candidate target names <name>.stale-<unix-ts> with os.Lstat to find a free one; this error is returned when Lstat fails with something other than 'not exists', meaning it could not determine whether the target path is free. The quarantine rename is abandoned.

Source

Thrown at internal/storage/dbproxy/proxy/endpoint.go:702

	default:
		return fmt.Errorf("cannot spawn from proxy discovery status %s", discovery.status)
	}
	target, err := quarantineRecord(rootDir, PIDFileName, time.Now())
	if err != nil {
		return fmt.Errorf("quarantine proxy record: %w", err)
	}
	log.Printf("dbproxy: preserved proxy record as %s", target)
	return nil
}

func quarantineRecord(rootDir, name string, now time.Time) (string, error) {
	source := pidfile.Path(rootDir, name)
	for stamp := now.Unix(); ; stamp++ {
		target := filepath.Join(rootDir, name+".stale-"+strconv.FormatInt(stamp, 10))
		if _, err := os.Lstat(target); err == nil {
			continue
		} else if !errors.Is(err, fs.ErrNotExist) {
			return "", fmt.Errorf("inspect quarantine target %s: %w", target, err)
		}
		if err := os.Rename(source, target); err != nil {
			return "", fmt.Errorf("rename %s to %s: %w", source, target, err)
		}
		return target, nil
	}
}

func sweepOldQuarantines(rootDir string, now time.Time) error {
	entries, err := os.ReadDir(rootDir)
	if err != nil {
		return err
	}
	cutoff := now.Add(-quarantineRetention).Unix()
	prefixes := []string{
		PIDFileName + ".stale-",
		server.PIDFileName + ".stale-",
	}

View on GitHub (pinned to 71377f2769)

Solutions

  1. Inspect the wrapped Lstat error (ls -la the workspace for symlink loops or odd entries matching *.stale-*)
  2. Remove or fix the problematic entry (broken symlink, wrong ownership) in the workspace root
  3. Shorten the workspace path if ENAMETOOLONG is the cause
  4. Re-run the command after the filesystem settles (transient EACCES from AV/indexers usually clears)

Example fix

// before
if _, err := os.Lstat(target); err == nil {
    continue
} else if !errors.Is(err, fs.ErrNotExist) {
    return "", fmt.Errorf("inspect quarantine target %s: %w", target, err)
}
// after
if _, err := os.Lstat(target); err == nil {
    continue
} else if errors.Is(err, fs.ErrNotExist) || errors.Is(err, syscall.EACCES) { // treat denied stat as free
    _ = err
} else {
    return "", fmt.Errorf("inspect quarantine target %s: %w", target, err)
}
Defensive patterns

Strategy: validation

Validate before calling

for _, e := range staleCandidates(root, PIDFileName) {
    if fi, err := os.Lstat(e); err != nil && !errors.Is(err, fs.ErrNotExist) {
        return fmt.Errorf("precheck: %s: %w", e, err) // fix perms/symlinks first
    }
}

Try / catch

target, err := quarantineRecord(root, PIDFileName, time.Now())
if err != nil && strings.Contains(err.Error(), "inspect quarantine target") {
    // broken symlink or EACCES on a stale-<ts> name: remove/fix it, then retry
}

Prevention

When it happens

Trigger: os.Lstat(target) returns e.g. EACCES, ELOOP, or ENAMETOOLONG while iterating candidate stale-file names in the workspace root.

Common situations: Search-index or AV interfering with stat calls on Windows; a symlink loop or oddly-permissioned directory entry named like a stale quarantine file; an extremely long workspace path hitting ENAMETOOLONG.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/f29b559fd6ac1535. Report an issue: GitHub.