JuliusBrussee/caveman · error

native session key close: %w

Error message

native session key close: %w

What it means

The final Close() of the newly written session.key returned an error (e.g. delayed EIO from a failed flush). The function treats any close failure as fatal because the key's on-disk state is uncertain. This is the rarest failure in the write path and, like the other write-path errors, is paired with cleanup of the partial file where the handle is still open.

Source

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

	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)
	}
	return key, nil
}

View on GitHub (pinned to 27d5a3981a)

Solutions

  1. Check the underlying errno in the wrapped error — EIO on close usually means the write path is unhealthy
  2. Verify the mount is healthy (remount NFS, check server) and retry
  3. Relocate home to local disk if this recurs
Defensive patterns

Strategy: retry

Try / catch

key, err := nativeruntime.LoadOrCreateSessionKey(home)
if err != nil && strings.Contains(err.Error(), "session key close") {
    // close-time EIO: verify the file instead of trusting or discarding it blindly
    if b, rerr := os.ReadFile(filepath.Join(home, "runtime", "session.key")); rerr == nil && len(b) == 32 {
        key = b // key survived despite close error
    }
}

Prevention

When it happens

Trigger: NFS close flushing dirty pages that hit a server error; full disk surfacing at close; file handle invalidated by a forced unmount.

Common situations: Network home directories; storage disconnected while the process was starting.

Related errors


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