alibaba/open-code-review · error
open session file: %w
Error message
open session file: %w
What it means
Thrown when os.OpenFile cannot create/open the session JSONL file <sessionDir>/<sessionID>.jsonl with flags O_CREATE|O_WRONLY|O_TRUNC and mode 0600. The session directory was created successfully but the file itself could not be opened, so session persistence cannot start.
Source
Thrown at internal/session/persist.go:117
}
return result
}
func (jw *jsonlWriter) open() error {
home, err := os.UserHomeDir()
if err != nil {
return fmt.Errorf("resolve home dir: %w", err)
}
sessionDir := filepath.Join(home, ".opencodereview", sessionSubDir, encodeRepoPath(jw.repoDir))
if err := os.MkdirAll(sessionDir, 0700); err != nil {
return fmt.Errorf("create session dir: %w", err)
}
filename := filepath.Join(sessionDir, jw.sessionID+".jsonl")
f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return fmt.Errorf("open session file: %w", err)
}
jw.file = f
jw.writer = bufio.NewWriter(f)
return nil
}
func (jw *jsonlWriter) writeRecordLocked(rec map[string]any) {
data, err := json.Marshal(rec)
if err != nil {
fmt.Printf("[ocr session] failed to marshal record: %v\n", err)
return
}
jw.writer.Write(data)
jw.writer.WriteByte('\n')
}
// WriteSessionStart writes the initial session_start record.View on GitHub (pinned to 5cf97d0d15)
Solutions
- Free disk space / check quota on the volume holding $HOME (df -h ~; quota -s)
- Inspect the wrapped PathError for the exact path; verify parent dir is still writable
- Check that sessionID is a sane short identifier (no path separators, reasonable length)
- If the volume is read-only, point HOME at a writable location
Defensive patterns
Strategy: validation
Validate before calling
home, _ := os.UserHomeDir()
sessionDir := filepath.Join(home, ".opencodereview")
if fi, err := os.Stat(sessionDir); err != nil || !fi.IsDir() {
return fmt.Errorf("session dir not usable: %s", sessionDir)
}
if unix.Statfs(sessionDir) reports full, fail early // or check df output externally Try / catch
if err := runOCR(); err != nil {
if strings.Contains(err.Error(), "open session file") {
var pe *fs.PathError
if errors.As(err, &pe) {
log.Fatalf("cannot open %s: %v", pe.Path, pe.Err)
}
}
} Prevention
- Keep session IDs short and free of path separators
- Ensure free disk space on $HOME's filesystem
- Do not mount $HOME read-only for the tool's user
When it happens
Trigger: newJSONLWriter -> open() after MkdirAll succeeds: os.OpenFile on <sessionID>.jsonl fails due to disk full, path too long, or another component becoming unwritable between mkdir and open.
Common situations: Disk quota exceeded while writing to $HOME; sessionID containing pathological characters creating an overly long filename; filesystem turned read-only (remounted) mid-run; antivirus/EDR blocking new files in $HOME.
Understand the failure class
Background: "open() failed", "failed to open file", "cannot create file" — what a file open error means and how to fix it — this error's family across 42 libraries.
Related errors
AI-assisted analysis of alibaba/open-code-review@5cf97d0d15 (2026-09-02).
Data as JSON: /api/errors/f80e68470d75975d.
Report an issue: GitHub.