Skip to content

fix(secfile): make Write atomic (temp + fsync + rename)#202

Open
gmoigneu wants to merge 1 commit into
mainfrom
fix/120-atomic-mcp-writes
Open

fix(secfile): make Write atomic (temp + fsync + rename)#202
gmoigneu wants to merge 1 commit into
mainfrom
fix/120-atomic-mcp-writes

Conversation

@gmoigneu

@gmoigneu gmoigneu commented May 3, 2026

Copy link
Copy Markdown
Contributor

Closes #120. secfile.Write (the helper every MCP/telemetry/init writer routes through) now writes to a sibling temp file, fsyncs, and atomically renames onto the target. A crash mid-write cannot leave a half-written file at the destination.

secfile.Write was a thin os.WriteFile that left a window where a
crash, SIGINT, or full-disk could land a half-written file at the
target — destroying the previous content (or any unrelated keys
that the codec was supposed to round-trip through, in the MCP /
telemetry case).

Now writes to a sibling temp file (path.gaal-tmp-<rand>), chmods to
0o600 on the temp, fsyncs, then renames onto the final path. Same-
filesystem rename is atomic on POSIX and Windows. The previous
direct-WriteFile path is kept as a fallback when temp creation fails
(rare; logged at warn).

Closes #120. Reliability nets all callers of secfile.Write — MCP
codecs (json + toml), telemetry consent persistence, telemetry
milestone state, gaal init writes, --log-file open.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mcp: write configs atomically (temp + rename) and add per-target lock

1 participant