Skip to content

Commit 5d51825

Browse files
committed
fix: use renameio maybe.WriteFile for cross-platform atomic state saves
1 parent ffd8366 commit 5d51825

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

internal/mcp/state.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"sync"
1313
"time"
1414

15-
"github.com/google/renameio/v2"
15+
"github.com/google/renameio/v2/maybe"
1616
)
1717

1818
// Sandbox is a single tracked MCP-managed sandbox.
@@ -142,9 +142,10 @@ func (s *State) SetStatus(name, status string) {
142142
s.update(name, func(sb *Sandbox) { sb.Status = status })
143143
}
144144

145-
// Save persists state atomically via renameio: a crash mid-save leaves either
146-
// the previous contents or the new contents, never zero-length. On-disk
147-
// sandbox order is non-deterministic across saves (map iteration order).
145+
// Save persists state via renameio's maybe.WriteFile: atomic on Unix (a crash
146+
// mid-save leaves either the previous or new contents, never zero-length) and
147+
// best-effort on Windows. On-disk sandbox order is non-deterministic across
148+
// saves (map iteration order).
148149
func (s *State) Save() error {
149150
s.mu.RLock()
150151
data := stateData{Sandboxes: slices.Collect(maps.Values(s.sandboxes))}
@@ -158,7 +159,7 @@ func (s *State) Save() error {
158159
return fmt.Errorf("create state dir: %w", err)
159160
}
160161

161-
if err := renameio.WriteFile(s.path, b, 0o600); err != nil {
162+
if err := maybe.WriteFile(s.path, b, 0o600); err != nil {
162163
return fmt.Errorf("write state: %w", err)
163164
}
164165
return nil

0 commit comments

Comments
 (0)