alibaba/open-code-review · error
write session_end: %w
Error message
write session_end: %w
What it means
WriteSessionEnd writes the marshalled session_end JSON line through the bufio.Writer; a failure on the initial Write(data) is reported as 'write session_end'. This is an I/O failure (or a write on an already-broken/closed file), distinct from the later newline-byte and flush failures which reuse the same message.
Source
Thrown at internal/session/persist.go:405
jw.lastUUID = uuid
// Marshal explicitly (not via writeRecordLocked) so a marshal failure on the
// final record is reported rather than swallowed.
data, err := json.Marshal(rec)
if err != nil {
if jw.writer != nil {
jw.writer.Flush()
}
if jw.file != nil {
jw.file.Close()
}
return fmt.Errorf("marshal session_end: %w", err)
}
var writeErr error
if jw.writer != nil {
if _, err := jw.writer.Write(data); err != nil {
writeErr = fmt.Errorf("write session_end: %w", err)
} else if err := jw.writer.WriteByte('\n'); err != nil {
writeErr = fmt.Errorf("write session_end: %w", err)
} else if err := jw.writer.Flush(); err != nil {
writeErr = fmt.Errorf("flush session_end: %w", err)
}
}
if jw.file != nil {
if err := jw.file.Close(); err != nil && writeErr == nil {
writeErr = fmt.Errorf("close session file: %w", err)
}
}
return writeErr
}
func (jw *jsonlWriter) flushAndClose() {
jw.mu.Lock()
defer jw.mu.Unlock()
if jw.writer != nil {View on GitHub (pinned to 5cf97d0d15)
Solutions
- Check the wrapped error: ENOSPC means free disk space; EBADF means the file was already closed — fix the double-close/double-WriteSessionEnd call path
- Ensure WriteSessionEnd is called exactly once per jsonlWriter
- Check disk space/quota on $HOME's filesystem
- If this recurs on network filesystems, persist sessions on a local disk instead
Defensive patterns
Strategy: try-catch
Validate before calling
// ensure disk has headroom before finalizing
if fi, err := os.Stat(homeDir); err == nil {
_ = fi // or run statfs and check free bytes > record size
} Try / catch
if err := writer.WriteSessionEnd(); err != nil {
if strings.Contains(err.Error(), "write session_end") {
if errors.Is(err, syscall.ENOSPC) {
log.Fatal("disk full: free space and re-run")
}
if errors.Is(err, os.ErrClosed) {
log.Fatal("session file closed twice: fix finalization path")
}
}
} Prevention
- Call WriteSessionEnd exactly once per writer
- Ensure adequate disk space/quota on $HOME
- Never close the underlying file while the writer is in use
When it happens
Trigger: WriteSessionEnd: jw.writer.Write(data) returns an error — the underlying file descriptor is bad/closed, or an I/O error occurs writing the buffered bytes to the file.
Common situations: Writing a session_end after the file was already closed (double finalization); disk became full so buffered writes fail; ENOSPC/EIO on the filesystem hosting $HOME.
Related errors
- close output file: %w
- create output file %s: %w
- flush session_end: %w
- close session file: %w
- read background file %q: %w
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/10bd7f9b3558588f.
Report an issue: GitHub.