From 42992bab6a4fe49c76a96f40f49eb0ba80719d4f Mon Sep 17 00:00:00 2001 From: zhuangqh Date: Tue, 22 Jan 2019 14:46:54 +0800 Subject: [PATCH] fix: update container state according to containerd events Signed-off-by: zhuangqh --- daemon/mgr/container.go | 2 +- daemon/mgr/container_state.go | 12 ++++++++++++ daemon/mgr/events.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/daemon/mgr/container.go b/daemon/mgr/container.go index b70931fb6..ab77a63dc 100644 --- a/daemon/mgr/container.go +++ b/daemon/mgr/container.go @@ -221,7 +221,7 @@ func NewContainerManager(ctx context.Context, store *meta.Store, cli ctrd.APICli mgr.Client.SetExitHooks(mgr.exitedAndRelease) mgr.Client.SetExecExitHooks(mgr.execExitedAndRelease) - mgr.Client.SetEventsHooks(mgr.publishContainerdEvent) + mgr.Client.SetEventsHooks(mgr.publishContainerdEvent, mgr.updateContainerState) go mgr.execProcessGC() diff --git a/daemon/mgr/container_state.go b/daemon/mgr/container_state.go index 6d75430eb..77c75bf7f 100644 --- a/daemon/mgr/container_state.go +++ b/daemon/mgr/container_state.go @@ -140,6 +140,18 @@ func (c *Container) SetStatusUnpaused() { c.setStatusFlags(types.StatusRunning) } +// SetStatusOOM sets a container to be status exit because of OOM. +func (c *Container) SetStatusOOM() { + c.Lock() + defer c.Unlock() + c.State.OOMKilled = true + c.State.Status = types.StatusExited + c.State.Pid = 0 + c.State.ExitCode = 137 + c.State.Error = "OOMKilled" + c.setStatusFlags(types.StatusExited) +} + // Notes(ziren): i still feel uncomfortable for a function hasing no return // setStatusFlags set the specified status flag to true, and unset others func (c *Container) setStatusFlags(status types.Status) { diff --git a/daemon/mgr/events.go b/daemon/mgr/events.go index c632cd93d..8c67c367b 100644 --- a/daemon/mgr/events.go +++ b/daemon/mgr/events.go @@ -2,10 +2,13 @@ package mgr import ( "context" + "strconv" "strings" "github.com/alibaba/pouch/apis/types" + "github.com/docker/libnetwork" + "github.com/sirupsen/logrus" ) // LogContainerEvent generates an event related to a container with only the default attributes. @@ -109,3 +112,33 @@ func (mgr *ContainerManager) publishContainerdEvent(ctx context.Context, id, act return nil } + +// updateContainerState update container's state according to the containerd events. +func (mgr *ContainerManager) updateContainerState(ctx context.Context, id, action string, attributes map[string]string) error { + c, err := mgr.container(id) + if err != nil { + return err + } + + dirty := true + switch action { + case "die": + exitCode, err := strconv.ParseInt(attributes["exitCode"], 10, 64) + if err != nil { + logrus.Warnf("failed to parse exitCode: %v", err) + } + c.SetStatusExited(exitCode, "") + case "oom": + c.SetStatusOOM() + default: + dirty = false + } + + if dirty { + if err := mgr.Store.Put(c); err != nil { + return err + } + } + + return nil +}