Permalink
Browse files

libcontainer: cgroups: Write freezer state after every state check

This commit ensures we write the expected freezer cgroup state after
every state check, in case the state check does not give the expected
result. This can happen when a new task is created and prevents the
whole cgroup to be FROZEN, leaving the state into FREEZING instead.

This patch prevents the case of an infinite loop to happen.

Fixes #1609

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
  • Loading branch information...
sboeuf committed Oct 12, 2017
1 parent beb8716 commit acb93c9c622d7821fa333d531722ebef18d10703
Showing with 9 additions and 4 deletions.
  1. +9 −4 libcontainer/cgroups/fs/freezer.go
@@ -29,18 +29,23 @@ func (s *FreezerGroup) Apply(d *cgroupData) error {
func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
switch cgroup.Resources.Freezer {
case configs.Frozen, configs.Thawed:
if err := writeFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil {
return err
}
for {
// In case this loop does not exit because it doesn't get the expected
// state, let's write again this state, hoping it's going to be properly
// set this time. Otherwise, this loop could run infinitely, waiting for
// a state change that would never happen.
if err := writeFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil {
return err
}
state, err := readFile(path, "freezer.state")
if err != nil {
return err
}
if strings.TrimSpace(state) == string(cgroup.Resources.Freezer) {
break
}
time.Sleep(1 * time.Millisecond)
}
case configs.Undefined:

0 comments on commit acb93c9

Please sign in to comment.