github.com/hinshun/containerd@v0.2.7/supervisor/delete.go (about) 1 package supervisor 2 3 import ( 4 "time" 5 6 "github.com/Sirupsen/logrus" 7 "github.com/docker/containerd/runtime" 8 ) 9 10 // DeleteTask holds needed parameters to remove a container 11 type DeleteTask struct { 12 baseTask 13 ID string 14 Status uint32 15 PID string 16 NoEvent bool 17 Process runtime.Process 18 } 19 20 func (s *Supervisor) delete(t *DeleteTask) error { 21 if i, ok := s.containers[t.ID]; ok { 22 start := time.Now() 23 if err := s.deleteContainer(i.container); err != nil { 24 logrus.WithField("error", err).Error("containerd: deleting container") 25 } 26 if t.Process != nil { 27 t.Process.Wait() 28 } 29 if !t.NoEvent { 30 execMap := s.getDeleteExecSyncMap(t.ID) 31 go func() { 32 // Wait for all exec processe events to be sent (we seem 33 // to sometimes receive them after the init event) 34 for _, ch := range execMap { 35 <-ch 36 } 37 s.notifySubscribers(Event{ 38 Type: StateExit, 39 Timestamp: time.Now(), 40 ID: t.ID, 41 Status: t.Status, 42 PID: t.PID, 43 }) 44 }() 45 } 46 ContainersCounter.Dec(1) 47 ContainerDeleteTimer.UpdateSince(start) 48 } 49 return nil 50 } 51 52 func (s *Supervisor) deleteContainer(container runtime.Container) error { 53 delete(s.containers, container.ID()) 54 return container.Delete() 55 }