Sfoglia il codice sorgente

Detect and mark ghost container.

Guillaume J. Charmes 12 anni fa
parent
commit
313d13ea01
3 ha cambiato i file con 16 aggiunte e 0 eliminazioni
  1. 9 0
      container.go
  2. 3 0
      runtime.go
  3. 4 0
      state.go

+ 9 - 0
container.go

@@ -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 {

+ 3 - 0
runtime.go

@@ -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
 	}

+ 4 - 0
state.go

@@ -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)