From b26b223eb779978bc6e0f47e25df264acb012624 Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Tue, 14 Nov 2017 20:59:40 -0500 Subject: [PATCH] Fix some issues with locking on the container - Fix OOM event updating healthchecks and persisting container state without locks - Fix healthchecks being updated without locks on container stop Signed-off-by: Brian Goff Upstream-commit: 972cb4978795029131697bd3b3746e321eec5c13 Component: engine --- components/engine/daemon/kill.go | 2 ++ components/engine/daemon/monitor.go | 4 ++++ components/engine/daemon/stop.go | 2 -- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/components/engine/daemon/kill.go b/components/engine/daemon/kill.go index a230eaa76e..1292f86b0c 100644 --- a/components/engine/daemon/kill.go +++ b/components/engine/daemon/kill.go @@ -64,6 +64,8 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int) container.Lock() defer container.Unlock() + daemon.stopHealthchecks(container) + if !container.Running { return errNotRunning(container.ID) } diff --git a/components/engine/daemon/monitor.go b/components/engine/daemon/monitor.go index c0a265dac5..c635edc12a 100644 --- a/components/engine/daemon/monitor.go +++ b/components/engine/daemon/monitor.go @@ -39,10 +39,14 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc if runtime.GOOS == "windows" { return errors.New("received StateOOM from libcontainerd on Windows. This should never happen") } + + c.Lock() + defer c.Unlock() daemon.updateHealthMonitor(c) if err := c.CheckpointTo(daemon.containersReplica); err != nil { return err } + daemon.LogContainerEvent(c, "oom") case libcontainerd.EventExit: if int(ei.Pid) == c.Pid { diff --git a/components/engine/daemon/stop.go b/components/engine/daemon/stop.go index 7eadba7e26..71d0b2ab9c 100644 --- a/components/engine/daemon/stop.go +++ b/components/engine/daemon/stop.go @@ -43,8 +43,6 @@ func (daemon *Daemon) containerStop(container *containerpkg.Container, seconds i return nil } - daemon.stopHealthchecks(container) - stopSignal := container.StopSignal() // 1. Send a stop signal if err := daemon.killPossiblyDeadProcess(container, stopSignal); err != nil {