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

  1. Check the wrapped error: ENOSPC means free disk space; EBADF means the file was already closed — fix the double-close/double-WriteSessionEnd call path
  2. Ensure WriteSessionEnd is called exactly once per jsonlWriter
  3. Check disk space/quota on $HOME's filesystem
  4. 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

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


AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02). Data as JSON: /api/errors/10bd7f9b3558588f. Report an issue: GitHub.