From 70c1de9ff637cc152c4926a54bea4a4b0b738fa5 Mon Sep 17 00:00:00 2001 From: Carlo Lobrano Date: Thu, 9 Oct 2025 10:37:24 +0200 Subject: [PATCH] OCPBUGS-60273: Ensure revision.json persists on ungraceful shutdown Add os.O_SYNC flag to OpenFile call in trySaveRevision to force synchronous writes to disk. This prevents the revision.json file from being empty if the process terminates unexpectedly before buffered data is flushed. --- pkg/cmd/rev/rev.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/cmd/rev/rev.go b/pkg/cmd/rev/rev.go index 542c9d72ba..568d7b8046 100644 --- a/pkg/cmd/rev/rev.go +++ b/pkg/cmd/rev/rev.go @@ -189,14 +189,24 @@ func trySaveRevision(ctx context.Context, endpoints []string, outputFile string, } tmpPath := fmt.Sprintf("%s.tmp", outputFile) - file, err := os.OpenFile(tmpPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + file, err := os.OpenFile(tmpPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC|os.O_SYNC, 0644) if err != nil { klog.Errorf("error opening file: %v", err) return } defer func() { - if err = file.Close(); err != nil { - klog.Errorf("error closing file: %v", err) + if closeErr := file.Close(); closeErr != nil { + klog.Errorf("error closing file: %v", closeErr) + return + } + // Only rename if no error occurred before + if err != nil { + klog.Errorf("could not create temporary revision.json, keeping current version: %v", err) + return + } + if err = os.Rename(tmpPath, outputFile); err != nil { + klog.Errorf("error during rename to destination file: %v", err) + return } }() @@ -205,11 +215,6 @@ func trySaveRevision(ctx context.Context, endpoints []string, outputFile string, klog.Errorf("error writing result to file: %v", err) return } - - if err = os.Rename(tmpPath, outputFile); err != nil { - klog.Errorf("error during rename to destination file: %v", err) - return - } } func newETCD3Client(ctx context.Context, endpoints []string, tlsInfo transport.TLSInfo) (*clientv3.Client, error) {