Move all constants for event types to types.go for easier code readability and maintainance. Signed-off-by: Zhang Wei <zhangwei555@huawei.com>
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package supervisor
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/Sirupsen/logrus"
 | 
						|
	"github.com/docker/containerd/runtime"
 | 
						|
)
 | 
						|
 | 
						|
type Worker interface {
 | 
						|
	Start()
 | 
						|
}
 | 
						|
 | 
						|
type startTask struct {
 | 
						|
	Container     runtime.Container
 | 
						|
	Checkpoint    string
 | 
						|
	Stdin         string
 | 
						|
	Stdout        string
 | 
						|
	Stderr        string
 | 
						|
	Err           chan error
 | 
						|
	StartResponse chan StartResponse
 | 
						|
}
 | 
						|
 | 
						|
func NewWorker(s *Supervisor, wg *sync.WaitGroup) Worker {
 | 
						|
	return &worker{
 | 
						|
		s:  s,
 | 
						|
		wg: wg,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type worker struct {
 | 
						|
	wg *sync.WaitGroup
 | 
						|
	s  *Supervisor
 | 
						|
}
 | 
						|
 | 
						|
func (w *worker) Start() {
 | 
						|
	defer w.wg.Done()
 | 
						|
	for t := range w.s.startTasks {
 | 
						|
		started := time.Now()
 | 
						|
		process, err := t.Container.Start(t.Checkpoint, runtime.NewStdio(t.Stdin, t.Stdout, t.Stderr))
 | 
						|
		if err != nil {
 | 
						|
			logrus.WithFields(logrus.Fields{
 | 
						|
				"error": err,
 | 
						|
				"id":    t.Container.ID(),
 | 
						|
			}).Error("containerd: start container")
 | 
						|
			t.Err <- err
 | 
						|
			evt := &DeleteTask{
 | 
						|
				ID:      t.Container.ID(),
 | 
						|
				NoEvent: true,
 | 
						|
			}
 | 
						|
			w.s.SendTask(evt)
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		if err := w.s.monitor.MonitorOOM(t.Container); err != nil && err != runtime.ErrContainerExited {
 | 
						|
			if process.State() != runtime.Stopped {
 | 
						|
				logrus.WithField("error", err).Error("containerd: notify OOM events")
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if err := w.s.monitorProcess(process); err != nil {
 | 
						|
			logrus.WithField("error", err).Error("containerd: add process to monitor")
 | 
						|
		}
 | 
						|
		ContainerStartTimer.UpdateSince(started)
 | 
						|
		t.Err <- nil
 | 
						|
		t.StartResponse <- StartResponse{
 | 
						|
			Container: t.Container,
 | 
						|
		}
 | 
						|
		w.s.notifySubscribers(Event{
 | 
						|
			Timestamp: time.Now(),
 | 
						|
			ID:        t.Container.ID(),
 | 
						|
			Type:      StateStart,
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |