freezer.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // +build linux
  2. package fs
  3. import (
  4. "fmt"
  5. "strings"
  6. "time"
  7. "github.com/opencontainers/runc/libcontainer/cgroups"
  8. "github.com/opencontainers/runc/libcontainer/cgroups/fscommon"
  9. "github.com/opencontainers/runc/libcontainer/configs"
  10. )
  11. type FreezerGroup struct {
  12. }
  13. func (s *FreezerGroup) Name() string {
  14. return "freezer"
  15. }
  16. func (s *FreezerGroup) Apply(d *cgroupData) error {
  17. _, err := d.join("freezer")
  18. if err != nil && !cgroups.IsNotFound(err) {
  19. return err
  20. }
  21. return nil
  22. }
  23. func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error {
  24. switch cgroup.Resources.Freezer {
  25. case configs.Frozen, configs.Thawed:
  26. for {
  27. // In case this loop does not exit because it doesn't get the expected
  28. // state, let's write again this state, hoping it's going to be properly
  29. // set this time. Otherwise, this loop could run infinitely, waiting for
  30. // a state change that would never happen.
  31. if err := fscommon.WriteFile(path, "freezer.state", string(cgroup.Resources.Freezer)); err != nil {
  32. return err
  33. }
  34. state, err := fscommon.ReadFile(path, "freezer.state")
  35. if err != nil {
  36. return err
  37. }
  38. if strings.TrimSpace(state) == string(cgroup.Resources.Freezer) {
  39. break
  40. }
  41. time.Sleep(1 * time.Millisecond)
  42. }
  43. case configs.Undefined:
  44. return nil
  45. default:
  46. return fmt.Errorf("Invalid argument '%s' to freezer.state", string(cgroup.Resources.Freezer))
  47. }
  48. return nil
  49. }
  50. func (s *FreezerGroup) Remove(d *cgroupData) error {
  51. return removePath(d.path("freezer"))
  52. }
  53. func (s *FreezerGroup) GetStats(path string, stats *cgroups.Stats) error {
  54. return nil
  55. }