From 5722532f7da918a2fb256ee5f3094c3c409a7193 Mon Sep 17 00:00:00 2001 From: Mathias Bergqvist Date: Fri, 17 Apr 2026 20:34:36 +0200 Subject: [PATCH] fix: session log error handling and scanner buffer size - Replace deprecated os.IsNotExist with errors.Is(err, fs.ErrNotExist) - Capture Close error in Append by calling it explicitly instead of defer - Increase scanner buffer to 1 MB per line to handle large JSONL entries Co-Authored-By: Claude Sonnet 4.6 --- internal/session/session.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/session/session.go b/internal/session/session.go index c14a1b4..79337e3 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -4,7 +4,9 @@ package session import ( "bufio" "encoding/json" + "errors" "fmt" + "io/fs" "os" "path/filepath" "time" @@ -44,21 +46,27 @@ func Append(sessionsDir, sessionID string, entry Entry) error { if err != nil { return fmt.Errorf("open session log: %w", err) } - defer f.Close() line, err := json.Marshal(entry) if err != nil { + _ = f.Close() return fmt.Errorf("marshal entry: %w", err) } - _, err = fmt.Fprintf(f, "%s\n", line) - return err + if _, err = fmt.Fprintf(f, "%s\n", line); err != nil { + _ = f.Close() + return fmt.Errorf("write entry: %w", err) + } + if err = f.Close(); err != nil { + return fmt.Errorf("close session log: %w", err) + } + return nil } // Read returns all entries for sessionID. Returns empty slice if no log exists. func Read(sessionsDir, sessionID string) ([]Entry, error) { path := filepath.Join(sessionsDir, sessionID+".jsonl") f, err := os.Open(path) - if os.IsNotExist(err) { + if errors.Is(err, fs.ErrNotExist) { return nil, nil } if err != nil { @@ -68,6 +76,7 @@ func Read(sessionsDir, sessionID string) ([]Entry, error) { var entries []Entry scanner := bufio.NewScanner(f) + scanner.Buffer(make([]byte, 0, 256*1024), 1<<20) // up to 1 MB per line for scanner.Scan() { line := scanner.Bytes() if len(line) == 0 {