mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-20 18:31:15 +00:00
Merge pull request #106658 from wpedrak/even-more-resilient-version.txt
Even more resilient version.txt
This commit is contained in:
commit
e3c83c6134
@ -144,12 +144,36 @@ func (v *VersionFile) Read() (*EtcdVersionPair, error) {
|
|||||||
return vp, nil
|
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.
|
// Write creates or overwrites the contents of the version.txt file with the given EtcdVersionPair.
|
||||||
func (v *VersionFile) Write(vp *EtcdVersionPair) error {
|
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
|
// We do write + rename instead of just write to protect from version.txt
|
||||||
// corruption under full disk condition.
|
// corruption under full disk condition.
|
||||||
// See https://github.com/kubernetes/kubernetes/issues/98989.
|
// 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 {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to write new version file %s: %v", v.nextPath(), err)
|
return fmt.Errorf("failed to write new version file %s: %v", v.nextPath(), err)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user