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  }