Skip to content

Commit

Permalink
Add freeze state to output
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
  • Loading branch information
crosbymichael committed Oct 12, 2016
1 parent c05ab2e commit b3f3344
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 17 deletions.
11 changes: 11 additions & 0 deletions control.go
Expand Up @@ -89,6 +89,16 @@ type Hierarchy func() ([]Subsystem, error)

type Path func(subsystem Name) string

type State string

const (
Unknown State = ""
Thawed State = "thawed"
Frozen State = "frozen"
Freezing State = "freezing"
Deleted State = "deleted"
)

// Cgroup handles interactions with the individual groups to perform
// actions on them as them main interface to this cgroup package
type Cgroup interface {
Expand All @@ -100,4 +110,5 @@ type Cgroup interface {
Freeze() error
Thaw() error
OOMEventFD() (uintptr, error)
State() State
}
34 changes: 17 additions & 17 deletions freezer.go
Expand Up @@ -7,13 +7,6 @@ import (
"time"
)

type freezerState string

const (
frozen freezerState = "FROZEN"
thawed freezerState = "THAWED"
)

func NewFreezer(root string) *FreezerController {
return &FreezerController{
root: filepath.Join(root, string(Freezer)),
Expand All @@ -33,35 +26,42 @@ func (f *FreezerController) Path(path string) string {
}

func (f *FreezerController) Freeze(path string) error {
if err := f.changeState(path, frozen); err != nil {
if err := f.changeState(path, Frozen); err != nil {
return err
}
return f.waitState(path, frozen)
return f.waitState(path, Frozen)
}

func (f *FreezerController) Thaw(path string) error {
if err := f.changeState(path, thawed); err != nil {
if err := f.changeState(path, Thawed); err != nil {
return err
}
return f.waitState(path, thawed)
return f.waitState(path, Thawed)
}

func (f *FreezerController) changeState(path string, state freezerState) error {
func (f *FreezerController) changeState(path string, state State) error {
return ioutil.WriteFile(
filepath.Join(f.root, path, "freezer.state"),
[]byte(state),
[]byte(strings.ToUpper(string(state))),
defaultFilePerm,
)
}

func (f *FreezerController) waitState(path string, state freezerState) error {
file := filepath.Join(f.root, path, "freezer.state")
func (f *FreezerController) state(path string) (State, error) {
current, err := ioutil.ReadFile(filepath.Join(f.root, path, "freezer.state"))
if err != nil {
return "", err
}
return State(strings.ToLower(strings.TrimSpace(string(current)))), nil
}

func (f *FreezerController) waitState(path string, state State) error {
for {
current, err := ioutil.ReadFile(file)
current, err := f.state(path)
if err != nil {
return err
}
if freezerState(strings.TrimSpace(string(current))) == state {
if current == state {
return nil
}
time.Sleep(1 * time.Millisecond)
Expand Down
17 changes: 17 additions & 0 deletions v1.go
Expand Up @@ -242,6 +242,23 @@ func (c *v1) OOMEventFD() (uintptr, error) {
return s.(*MemoryController).OOMEventFD(c.path(Memory))
}

func (c *v1) State() State {
c.mu.Lock()
defer c.mu.Unlock()
if c.err != nil && c.err == ErrCgroupDeleted {
return Deleted
}
s := c.getSubsystem(Freezer)
if s == nil {
return Thawed
}
state, err := s.(*FreezerController).state(c.path(Freezer))
if err != nil {
return Unknown
}
return state
}

func (c *v1) getSubsystem(n Name) Subsystem {
for _, s := range c.subsystems {
if s.Name() == n {
Expand Down

0 comments on commit b3f3344

Please sign in to comment.