diff --git a/linux/task.go b/linux/task.go index 6d1024057..4b22d90ef 100644 --- a/linux/task.go +++ b/linux/task.go @@ -5,6 +5,7 @@ package linux import ( "context" + "github.com/pkg/errors" "google.golang.org/grpc" "github.com/containerd/cgroups" @@ -32,7 +33,8 @@ func newTask(id, namespace string, pid int, shim *client.Client, monitor runtime cg cgroups.Cgroup ) if pid > 0 { - if cg, err = cgroups.Load(cgroups.V1, cgroups.PidPath(pid)); err != nil { + cg, err = cgroups.Load(cgroups.V1, cgroups.PidPath(pid)) + if err != nil && err != cgroups.ErrCgroupDeleted { return nil, err } } @@ -253,6 +255,9 @@ func (t *Task) Process(ctx context.Context, id string) (runtime.Process, error) // Metrics returns runtime specific system level metric information for the task func (t *Task) Metrics(ctx context.Context) (interface{}, error) { + if t.cg == nil { + return nil, errors.Wrap(errdefs.ErrNotFound, "cgroup does not exist") + } stats, err := t.cg.Stat(cgroups.IgnoreNotExist) if err != nil { return nil, err @@ -261,8 +266,11 @@ func (t *Task) Metrics(ctx context.Context) (interface{}, error) { } // Cgroup returns the underlying cgroup for a linux task -func (t *Task) Cgroup() cgroups.Cgroup { - return t.cg +func (t *Task) Cgroup() (cgroups.Cgroup, error) { + if t.cg == nil { + return nil, errors.Wrap(errdefs.ErrNotFound, "cgroup does not exist") + } + return t.cg, nil } // Wait for the task to exit returning the status and timestamp diff --git a/metrics/cgroups/cgroups.go b/metrics/cgroups/cgroups.go index 609d9f3e1..0ac4c0180 100644 --- a/metrics/cgroups/cgroups.go +++ b/metrics/cgroups/cgroups.go @@ -62,10 +62,14 @@ type cgroupsMonitor struct { func (m *cgroupsMonitor) Monitor(c runtime.Task) error { info := c.Info() t := c.(*linux.Task) - if err := m.collector.Add(info.ID, info.Namespace, t.Cgroup()); err != nil { + cg, err := t.Cgroup() + if err != nil { return err } - return m.oom.Add(info.ID, info.Namespace, t.Cgroup(), m.trigger) + if err := m.collector.Add(info.ID, info.Namespace, cg); err != nil { + return err + } + return m.oom.Add(info.ID, info.Namespace, cg, m.trigger) } func (m *cgroupsMonitor) Stop(c runtime.Task) error { diff --git a/services/tasks/service.go b/services/tasks/service.go index cc126e73b..4b6d68bca 100644 --- a/services/tasks/service.go +++ b/services/tasks/service.go @@ -519,7 +519,9 @@ func getTasksMetrics(ctx context.Context, filter filters.Filter, tasks []runtime collected := time.Now() metrics, err := tk.Metrics(ctx) if err != nil { - log.G(ctx).WithError(err).Errorf("collecting metrics for %s", tk.ID()) + if !errdefs.IsNotFound(err) { + log.G(ctx).WithError(err).Errorf("collecting metrics for %s", tk.ID()) + } continue } data, err := typeurl.MarshalAny(metrics) diff --git a/vendor.conf b/vendor.conf index 0dbbeef64..aba41ed8a 100644 --- a/vendor.conf +++ b/vendor.conf @@ -1,7 +1,7 @@ github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6 github.com/containerd/go-runc b3c048c028ddd789c6f9510c597f8b9c62f25359 github.com/containerd/console 84eeaae905fa414d03e07bcd6c8d3f19e7cf180e -github.com/containerd/cgroups 5933ab4dc4f7caa3a73a1dc141bd11f42b5c9163 +github.com/containerd/cgroups 9c238e632e80d94f71a067c3deb9b34b1886ef18 github.com/containerd/typeurl f6943554a7e7e88b3c14aad190bf05932da84788 github.com/docker/go-metrics 8fd5772bf1584597834c6f7961a530f06cbfbb87 github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9 diff --git a/vendor/github.com/containerd/cgroups/cgroup.go b/vendor/github.com/containerd/cgroups/cgroup.go index 694e22305..d9fa75f31 100644 --- a/vendor/github.com/containerd/cgroups/cgroup.go +++ b/vendor/github.com/containerd/cgroups/cgroup.go @@ -10,6 +10,7 @@ import ( "sync" specs "github.com/opencontainers/runtime-spec/specs-go" + "github.com/pkg/errors" ) // New returns a new control via the cgroup cgroups interface @@ -39,6 +40,9 @@ func Load(hierarchy Hierarchy, path Path) (Cgroup, error) { for _, s := range pathers(subsystems) { p, err := path(s.Name()) if err != nil { + if os.IsNotExist(errors.Cause(err)) { + return nil, ErrCgroupDeleted + } return nil, err } if _, err := os.Lstat(s.Path(p)); err != nil {