JuliusBrussee/caveman · error

native session key sync: %w

Error message

native session key sync: %w

What it means

After a successful write of the session key, file.Sync (fsync) failed before the key was acknowledged. Sync guarantees the key survives a crash before callers rely on it for HMAC session markers; on failure the file is removed so no half-durable key is trusted. Common on filesystems with broken fsync (some network/overlay mounts) or failing disks.

Source

Thrown at proxy/internal/nativeruntime/marker.go:46

	if err := os.Chmod(dir, 0o700); err != nil {
		return nil, fmt.Errorf("native session key chmod dir: %w", err)
	}
	path := filepath.Join(dir, "session.key")
	key := make([]byte, sessionKeyBytes)
	if _, err := rand.Read(key); err != nil {
		return nil, fmt.Errorf("native session key random: %w", err)
	}
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o600)
	if err == nil {
		if _, writeErr := file.Write(key); writeErr != nil {
			_ = file.Close()
			_ = os.Remove(path)
			return nil, fmt.Errorf("native session key write: %w", writeErr)
		}
		if syncErr := file.Sync(); syncErr != nil {
			_ = file.Close()
			_ = os.Remove(path)
			return nil, fmt.Errorf("native session key sync: %w", syncErr)
		}
		if closeErr := file.Close(); closeErr != nil {
			return nil, fmt.Errorf("native session key close: %w", closeErr)
		}
		return key, nil
	}
	if !errors.Is(err, os.ErrExist) {
		return nil, fmt.Errorf("native session key create: %w", err)
	}
	key, err = os.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("native session key read: %w", err)
	}
	if len(key) != sessionKeyBytes {
		return nil, fmt.Errorf("native session key length = %d, want %d", len(key), sessionKeyBytes)
	}
	if err := os.Chmod(path, 0o600); err != nil {
		return nil, fmt.Errorf("native session key chmod: %w", err)

View on GitHub (pinned to 27d5a3981a)

Solutions

  1. Move the caveman home directory to a local filesystem with working fsync
  2. Check dmesg/SMART for underlying disk errors if local
  3. Retry startup after remounting a flaky network volume
Defensive patterns

Strategy: validation

Validate before calling

func fsyncWorks(dir string) error {
    f, err := os.CreateTemp(dir, ".fsync-probe-*")
    if err != nil { return err }
    defer os.Remove(f.Name())
    defer f.Close()
    return f.Sync()
}

Prevention

When it happens

Trigger: home on NFS/CIFS/overlayfs where fsync returns EIO/ENOTSUP; failing disk or degraded RAID; virtual disk briefly detached.

Common situations: Home directory on a network mount; Docker Desktop file-sharing mounts; early signs of disk failure.

Related errors


AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15). Data as JSON: /api/errors/b7246e9cd9cf3422. Report an issue: GitHub.