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

  1. Free disk space / check quota on the volume holding $HOME (df -h ~; quota -s)
  2. Inspect the wrapped PathError for the exact path; verify parent dir is still writable
  3. Check that sessionID is a sane short identifier (no path separators, reasonable length)
  4. 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

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.