From 15b40f36f351155edb19639d561dc02a425c3abf Mon Sep 17 00:00:00 2001 From: cskh Date: Fri, 5 Jan 2024 14:46:19 -0500 Subject: [PATCH] Use safeio to write server metadata file (#20101) * Use safeio to write server metadata file * guard the conversion --- agent/agent.go | 9 +++++++++ agent/consul/server_metadata.go | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/agent/agent.go b/agent/agent.go index dca7bf9487..79a25a9ec0 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -31,6 +31,7 @@ import ( "github.com/hashicorp/hcp-scada-provider/capability" "github.com/hashicorp/raft" "github.com/hashicorp/serf/serf" + "github.com/rboyer/safeio" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/grpc" @@ -4668,6 +4669,14 @@ func (a *Agent) persistServerMetadata() { continue } + // Use safeio.File to ensure the file is written to disk atomically + if sf, ok := f.(*safeio.File); ok { + if err := sf.Commit(); err != nil { + sf.Close() + a.logger.Error("failed to commit server metadata", "error", err) + continue + } + } f.Close() case <-a.shutdownCh: return diff --git a/agent/consul/server_metadata.go b/agent/consul/server_metadata.go index 3ee706ba49..b9a4eaf2eb 100644 --- a/agent/consul/server_metadata.go +++ b/agent/consul/server_metadata.go @@ -8,6 +8,8 @@ import ( "io" "os" "time" + + "github.com/rboyer/safeio" ) // ServerMetadataFile is the name of the file on disk that server metadata @@ -31,7 +33,7 @@ func (md *ServerMetadata) IsLastSeenStale(d time.Duration) bool { // OpenServerMetadata is a helper function for opening the server metadata file // with the correct permissions. func OpenServerMetadata(filename string) (io.WriteCloser, error) { - return os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600) + return safeio.OpenFile(filename, 0600) } type ServerMetadataReadFunc func(filename string) (*ServerMetadata, error)