From 183793cb279b69b042de8b66afca818774f653fa Mon Sep 17 00:00:00 2001 From: wpedrak Date: Wed, 24 Nov 2021 16:10:01 +0100 Subject: [PATCH] Update version.txt only when necessary Follow up on https://github.com/kubernetes/kubernetes/pull/106653 --- cluster/images/etcd/migrate/data_dir.go | 26 ++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cluster/images/etcd/migrate/data_dir.go b/cluster/images/etcd/migrate/data_dir.go index 6ff0189e4a7..294e5877414 100644 --- a/cluster/images/etcd/migrate/data_dir.go +++ b/cluster/images/etcd/migrate/data_dir.go @@ -144,12 +144,36 @@ func (v *VersionFile) Read() (*EtcdVersionPair, error) { return vp, nil } +// equals returns true iff VersionFile exists and contains given EtcdVersionPair. +func (v *VersionFile) equals(vp *EtcdVersionPair) (bool, error) { + exists, err := v.Exists() + if err != nil { + return false, err + } + if !exists { + return false, nil + } + cvp, err := v.Read() + if err != nil { + return false, err + } + return vp.Equals(cvp), nil +} + // Write creates or overwrites the contents of the version.txt file with the given EtcdVersionPair. func (v *VersionFile) Write(vp *EtcdVersionPair) error { + // We do write only if file content differs from given EtcdVersionPair. + isUpToDate, err := v.equals(vp) + if err != nil { + return fmt.Errorf("failed to to check if version file %s should be changed: %v", v.path, err) + } + if isUpToDate { + return nil + } // We do write + rename instead of just write to protect from version.txt // corruption under full disk condition. // See https://github.com/kubernetes/kubernetes/issues/98989. - err := ioutil.WriteFile(v.nextPath(), []byte(vp.String()), 0666) + err = ioutil.WriteFile(v.nextPath(), []byte(vp.String()), 0666) if err != nil { return fmt.Errorf("failed to write new version file %s: %v", v.nextPath(), err) }