From 299dadd1b56a67d425ffc7c7259b053a533c3e6a Mon Sep 17 00:00:00 2001 From: decker Date: Tue, 24 Feb 2026 07:03:00 +0800 Subject: [PATCH] fix: implement atomic file writes in saveStoreUnsafe to prevent data loss on crash --- pkg/cron/service.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/cron/service.go b/pkg/cron/service.go index e699a44b5..101971009 100644 --- a/pkg/cron/service.go +++ b/pkg/cron/service.go @@ -340,7 +340,15 @@ func (cs *CronService) saveStoreUnsafe() error { return err } - return os.WriteFile(cs.storePath, data, 0o600) + // Write atomically: write to a temp file then rename. + // os.WriteFile truncates the file before writing, so a crash between + // truncation and completion leaves an empty or partial file. + // os.Rename on the same filesystem is atomic on Linux. + tmpPath := cs.storePath + ".tmp" + if err := os.WriteFile(tmpPath, data, 0600); err != nil { + return err + } + return os.Rename(tmpPath, cs.storePath) } func (cs *CronService) AddJob(