diff --git a/io_unix.go b/io_unix.go index d8d015b8d..cde30d452 100644 --- a/io_unix.go +++ b/io_unix.go @@ -36,7 +36,6 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) { var ( f io.ReadWriteCloser set []io.Closer - cwg sync.WaitGroup ctx, cancel = context.WithCancel(context.Background()) wg = &sync.WaitGroup{} ) @@ -53,9 +52,7 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) { return nil, err } set = append(set, f) - cwg.Add(1) go func(w io.WriteCloser) { - cwg.Done() io.Copy(w, ioset.in) w.Close() }(f) @@ -65,9 +62,7 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) { } set = append(set, f) wg.Add(1) - cwg.Add(1) go func(r io.ReadCloser) { - cwg.Done() io.Copy(ioset.out, r) r.Close() wg.Done() @@ -80,15 +75,12 @@ func copyIO(fifos *FIFOSet, ioset *ioSet, tty bool) (_ *wgCloser, err error) { if !tty { wg.Add(1) - cwg.Add(1) go func(r io.ReadCloser) { - cwg.Done() io.Copy(ioset.err, r) r.Close() wg.Done() }(f) } - cwg.Wait() return &wgCloser{ wg: wg, dir: fifos.Dir, diff --git a/linux/shim/client.go b/linux/shim/client.go index f34403ceb..2b5016fc5 100644 --- a/linux/shim/client.go +++ b/linux/shim/client.go @@ -49,7 +49,6 @@ func WithStart(binary, address string, debug bool) ClientOpt { if err != nil { terminate(cmd) } - reaper.Default.Delete(cmd.Process.Pid) }() log.G(ctx).WithFields(logrus.Fields{ "pid": cmd.Process.Pid, diff --git a/metrics/cgroups/cgroups.go b/metrics/cgroups/cgroups.go index 31d2f2148..5ef16c0c3 100644 --- a/metrics/cgroups/cgroups.go +++ b/metrics/cgroups/cgroups.go @@ -65,7 +65,6 @@ func (m *cgroupsMonitor) Monitor(c runtime.Task) error { func (m *cgroupsMonitor) Stop(c runtime.Task) error { info := c.Info() m.collector.Remove(info.ID, info.Namespace) - m.oom.Remove(info.ID, info.Namespace) return nil } diff --git a/metrics/cgroups/oom.go b/metrics/cgroups/oom.go index fd1845c1f..47d979f58 100644 --- a/metrics/cgroups/oom.go +++ b/metrics/cgroups/oom.go @@ -9,7 +9,6 @@ import ( "github.com/containerd/cgroups" metrics "github.com/docker/go-metrics" - "github.com/prometheus/client_golang/prometheus" "github.com/sirupsen/logrus" ) @@ -19,21 +18,20 @@ func NewOOMCollector(ns *metrics.Namespace) (*OOMCollector, error) { return nil, err } c := &OOMCollector{ - fd: fd, - set: make(map[uintptr]*oom), - desc: ns.NewDesc("memory_oom", "The number of times a container has received an oom event", metrics.Total, "container_id", "namespace"), + fd: fd, + memoryOOM: ns.NewLabeledGauge("memory_oom", "The number of times a container received an oom event", metrics.Total, "container_id", "namespace"), + set: make(map[uintptr]*oom), } go c.start() - ns.Add(c) return c, nil } type OOMCollector struct { mu sync.Mutex - fd int - set map[uintptr]*oom - desc *prometheus.Desc + memoryOOM metrics.LabeledGauge + fd int + set map[uintptr]*oom } type oom struct { @@ -41,7 +39,6 @@ type oom struct { namespace string c cgroups.Cgroup triggers []Trigger - count int } func (o *OOMCollector) Add(id, namespace string, cg cgroups.Cgroup, triggers ...Trigger) error { @@ -53,10 +50,12 @@ func (o *OOMCollector) Add(id, namespace string, cg cgroups.Cgroup, triggers ... } o.set[fd] = &oom{ id: id, - namespace: namespace, c: cg, triggers: triggers, + namespace: namespace, } + // set the gauge's default value + o.memoryOOM.WithValues(id, namespace).Set(0) event := unix.EpollEvent{ Fd: int32(fd), Events: unix.EPOLLHUP | unix.EPOLLIN | unix.EPOLLERR, @@ -67,37 +66,11 @@ func (o *OOMCollector) Add(id, namespace string, cg cgroups.Cgroup, triggers ... return nil } -func (o *OOMCollector) Remove(id, namespace string) { - o.mu.Lock() - defer o.mu.Unlock() - for fd, t := range o.set { - if t.id == id && t.namespace == namespace { - unix.Close(int(fd)) - delete(o.set, fd) - return - } - } -} - // Close closes the epoll fd func (o *OOMCollector) Close() error { return unix.Close(int(o.fd)) } -func (o *OOMCollector) Describe(ch chan<- *prometheus.Desc) { - o.mu.Lock() - defer o.mu.Unlock() - ch <- o.desc -} - -func (o *OOMCollector) Collect(ch chan<- prometheus.Metric) { - o.mu.Lock() - defer o.mu.Unlock() - for _, t := range o.set { - ch <- prometheus.MustNewConstMetric(o.desc, prometheus.GaugeValue, float64(t.count), t.id, t.namespace) - } -} - func (o *OOMCollector) start() { var events [128]unix.EpollEvent for { @@ -134,7 +107,7 @@ func (o *OOMCollector) process(fd uintptr, event uint32) { unix.Close(int(fd)) return } - info.count++ + o.memoryOOM.WithValues(info.id, info.namespace).Inc(1) for _, t := range info.triggers { t(info.id, info.c) } diff --git a/runtime/task.go b/runtime/task.go index 62fa171e6..4a5685e10 100644 --- a/runtime/task.go +++ b/runtime/task.go @@ -9,6 +9,7 @@ import ( type TaskInfo struct { ID string Runtime string + Spec []byte Namespace string }