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
- Check the underlying errno in the wrapped error — EIO on close usually means the write path is unhealthy
- Verify the mount is healthy (remount NFS, check server) and retry
- 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
- Treat close errors on network mounts as storage-health signals
- Remount/repair the volume, then restart — startup is idempotent
- Keep home on reliable local storage
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
- native session key mkdir: %w
- native session key chmod dir: %w
- native session key write: %w
- native session key sync: %w
- native session key create: %w
AI-assisted analysis of JuliusBrussee/caveman@27d5a3981a (2026-08-15).
Data as JSON: /api/errors/55915921db91b91c.
Report an issue: GitHub.