
This currently logs to a json file with the stream type. This is slow and hard on the cpu and memory so we need to swich this over to something like protobufs for the binary logs but this is just a start. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package containerd
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/docker/containerd/runtime"
|
|
)
|
|
|
|
type Worker interface {
|
|
Start()
|
|
}
|
|
|
|
type StartTask struct {
|
|
Container runtime.Container
|
|
Checkpoint string
|
|
IO *runtime.IO
|
|
Err chan error
|
|
}
|
|
|
|
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.tasks {
|
|
started := time.Now()
|
|
// start logging the container's stdio
|
|
if err := w.s.log(t.Container.Path(), t.IO); err != nil {
|
|
evt := NewEvent(DeleteEventType)
|
|
evt.ID = t.Container.ID()
|
|
w.s.SendEvent(evt)
|
|
t.Err <- err
|
|
continue
|
|
}
|
|
if t.Checkpoint != "" {
|
|
if err := t.Container.Restore(t.Checkpoint); err != nil {
|
|
evt := NewEvent(DeleteEventType)
|
|
evt.ID = t.Container.ID()
|
|
w.s.SendEvent(evt)
|
|
t.Err <- err
|
|
continue
|
|
}
|
|
} else {
|
|
if err := t.Container.Start(); err != nil {
|
|
evt := NewEvent(DeleteEventType)
|
|
evt.ID = t.Container.ID()
|
|
w.s.SendEvent(evt)
|
|
t.Err <- err
|
|
continue
|
|
}
|
|
}
|
|
ContainerStartTimer.UpdateSince(started)
|
|
t.Err <- nil
|
|
}
|
|
}
|