From cc46dbc03c1802892567042ef33488fad068ee08 Mon Sep 17 00:00:00 2001 From: Zhang Wei Date: Wed, 3 Aug 2016 10:11:01 +0800 Subject: [PATCH] Not use goroutine for container's auto-removal Before this, container's auto-removal after exit is done in a goroutine, this commit will get ContainerRm out of the goroutine. Signed-off-by: Zhang Wei Upstream-commit: 1537dbe2d617013c94aa42c28744feb07a09fb63 Component: engine --- components/engine/daemon/monitor.go | 9 +++++++++ components/engine/daemon/start.go | 14 ++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/components/engine/daemon/monitor.go b/components/engine/daemon/monitor.go index a2e3207878..63e5e844e9 100644 --- a/components/engine/daemon/monitor.go +++ b/components/engine/daemon/monitor.go @@ -11,6 +11,7 @@ import ( "github.com/docker/docker/daemon/exec" "github.com/docker/docker/libcontainerd" "github.com/docker/docker/runconfig" + "github.com/docker/engine-api/types" ) // StateChanged updates daemon state changes from containerd @@ -29,6 +30,14 @@ func (daemon *Daemon) StateChanged(id string, e libcontainerd.StateInfo) error { daemon.updateHealthMonitor(c) daemon.LogContainerEvent(c, "oom") case libcontainerd.StateExit: + // if containers AutoRemove flag is set, remove it after clean up + if c.HostConfig.AutoRemove { + defer func() { + if err := daemon.ContainerRm(c.ID, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}); err != nil { + logrus.Errorf("can't remove container %s: %v", c.ID, err) + } + }() + } c.Lock() defer c.Unlock() c.Wait() diff --git a/components/engine/daemon/start.go b/components/engine/daemon/start.go index 5ef7950be7..c1e6c7983e 100644 --- a/components/engine/daemon/start.go +++ b/components/engine/daemon/start.go @@ -113,6 +113,14 @@ func (daemon *Daemon) containerStart(container *container.Container) (err error) } container.ToDisk() daemon.Cleanup(container) + // if containers AutoRemove flag is set, remove it after clean up + if container.HostConfig.AutoRemove { + container.Unlock() + if err := daemon.ContainerRm(container.ID, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}); err != nil { + logrus.Errorf("can't remove container %s: %v", container.ID, err) + } + container.Lock() + } } }() @@ -198,10 +206,4 @@ func (daemon *Daemon) Cleanup(container *container.Container) { } } container.CancelAttachContext() - - // if containers AutoRemove flag is set, remove it after clean up - if container.HostConfig.AutoRemove { - // If containers lock is not released, goroutine will guarantee no block - go daemon.ContainerRm(container.ID, &types.ContainerRmConfig{ForceRemove: true, RemoveVolume: true}) - } }