alibaba/open-code-review · error

flush session_end: %w

Error message

flush session_end: %w

What it means

Raised when jw.writer.Flush() fails while finalizing the session_end record. The record body and newline were accepted into the buffer, but pushing the buffered bytes to the underlying file failed, so the session_end line may be partially written or missing on disk.

Source

Thrown at internal/session/persist.go:409

	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 {
		jw.writer.Flush()
	}
	if jw.file != nil {
		jw.file.Close()

View on GitHub (pinned to 5cf97d0d15)

Solutions

  1. Free disk space / resolve the underlying I/O condition reported by the wrapped error
  2. Check dmesg/mount health if on NFS or flaky storage; move ~/.opencodereview to local disk
  3. Inspect the tail of the session JSONL: a partial session_end line means the session was not finalized cleanly and replay (LoadResumeState) will fail parsing
  4. Re-run the review to produce a complete session file
Defensive patterns

Strategy: try-catch

Try / catch

if err := writer.WriteSessionEnd(); err != nil {
    if strings.Contains(err.Error(), "flush session_end") {
        if errors.Is(err, syscall.ENOSPC) {
            log.Fatal("disk full at flush time")
        }
        // verify session file integrity before resuming from it
        if _, err := session.LoadResumeState(repoDir, sessionID); err != nil {
            log.Printf("session file corrupt, starting fresh: %v", err)
        }
    }
}

Prevention

When it happens

Trigger: WriteSessionEnd: after successful Write(data) and WriteByte('\n'), bufio.Writer.Flush() returns the error stored by the underlying write to the file (commonly ENOSPC or EIO).

Common situations: Disk quota/space exhausted at flush time; filesystem I/O error (failing disk, network mount dropped); the file was closed underneath the buffered writer.

Related errors


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