diff options
author | Andrew Dunham <adunham@stripe.com> | 2020-06-29 09:09:53 -0700 |
---|---|---|
committer | Andrew Dunham <adunham@stripe.com> | 2020-07-01 15:58:07 -0700 |
commit | 079123b363e4ec5577f656001e77c1dcf057bbcb (patch) | |
tree | 89fed2e8b330d82245a018b2cf463b56030d6bb6 | |
parent | e8f1a5c1f652ba7abb8c4bd842d6afdcab03865a (diff) |
cgroup: retry file writes on EINTR errors
-rw-r--r-- | runsc/cgroup/cgroup.go | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/runsc/cgroup/cgroup.go b/runsc/cgroup/cgroup.go index e5cc9d622..8fbc3887a 100644 --- a/runsc/cgroup/cgroup.go +++ b/runsc/cgroup/cgroup.go @@ -92,7 +92,17 @@ func setOptionalValueUint16(path, name string, val *uint16) error { func setValue(path, name, data string) error { fullpath := filepath.Join(path, name) - return ioutil.WriteFile(fullpath, []byte(data), 0700) + + // Retry writes on EINTR; see: + // https://github.com/golang/go/issues/38033 + for { + err := ioutil.WriteFile(fullpath, []byte(data), 0700) + if err == nil { + return nil + } else if !errors.Is(err, syscall.EINTR) { + return err + } + } } func getValue(path, name string) (string, error) { @@ -132,8 +142,16 @@ func fillFromAncestor(path string) (string, error) { if err != nil { return "", err } - if err := ioutil.WriteFile(path, []byte(val), 0700); err != nil { - return "", err + + // Retry writes on EINTR; see: + // https://github.com/golang/go/issues/38033 + for { + err := ioutil.WriteFile(path, []byte(val), 0700) + if err == nil { + break + } else if !errors.Is(err, syscall.EINTR) { + return "", err + } } return val, nil } |