Detect and mark ghost container.

This commit is contained in:
Guillaume J. Charmes 2013-04-11 09:26:17 -07:00
parent c902c43766
commit 313d13ea01
3 changed files with 16 additions and 0 deletions

View file

@ -561,6 +561,12 @@ func (container *Container) kill() error {
func (container *Container) Kill() error {
container.State.lock()
defer container.State.unlock()
if !container.State.Running {
return nil
}
if container.State.Ghost {
return fmt.Errorf("Impossible to kill ghost containers")
}
return container.kill()
}
@ -570,6 +576,9 @@ func (container *Container) Stop() error {
if !container.State.Running {
return nil
}
if container.State.Ghost {
return fmt.Errorf("Impossible to stop ghost containers")
}
// 1. Send a SIGTERM
if output, err := exec.Command("lxc-kill", "-n", container.Id, "15").CombinedOutput(); err != nil {

View file

@ -119,6 +119,9 @@ func (runtime *Runtime) Load(id string) (*Container, error) {
if container.Id != id {
return container, fmt.Errorf("Container %s is stored at %s", container.Id, id)
}
if container.State.Running {
container.State.Ghost = true
}
if err := runtime.Register(container); err != nil {
return nil, err
}

View file

@ -12,11 +12,15 @@ type State struct {
ExitCode int
StartedAt time.Time
l *sync.Mutex
Ghost bool
}
// String returns a human-readable description of the state
func (s *State) String() string {
if s.Running {
if s.Ghost {
return fmt.Sprintf("Running ghost")
}
return fmt.Sprintf("Up %s", HumanDuration(time.Now().Sub(s.StartedAt)))
}
return fmt.Sprintf("Exit %d", s.ExitCode)