From a6daa760c8c1636db6ae23ebdf12ab3a8aa190cd Mon Sep 17 00:00:00 2001 From: Vishnu kannan Date: Fri, 4 Dec 2015 11:19:49 -0800 Subject: [PATCH] Fix goroutine leak in docker fs handler logic. Signed-off-by: Vishnu kannan --- container/container.go | 3 +++ container/docker/handler.go | 4 ++++ container/mock.go | 2 ++ container/raw/handler.go | 3 +++ manager/container.go | 2 ++ 5 files changed, 14 insertions(+) diff --git a/container/container.go b/container/container.go index 2ab5dfdfb3..f41c006acf 100644 --- a/container/container.go +++ b/container/container.go @@ -78,4 +78,7 @@ type ContainerHandler interface { // Returns whether the container still exists. Exists() bool + + // Cleanup frees up any resources being held like fds or go routines, etc. + Cleanup() } diff --git a/container/docker/handler.go b/container/docker/handler.go index 0c18de2457..2a1b3661ce 100644 --- a/container/docker/handler.go +++ b/container/docker/handler.go @@ -160,6 +160,10 @@ func newDockerContainerHandler( return handler, nil } +func (self *dockerContainerHandler) Cleanup() { + self.fsHandler.stop() +} + func (self *dockerContainerHandler) ContainerReference() (info.ContainerReference, error) { return info.ContainerReference{ Name: self.name, diff --git a/container/mock.go b/container/mock.go index 1e438a312a..40a8041908 100644 --- a/container/mock.go +++ b/container/mock.go @@ -51,6 +51,8 @@ func (self *MockContainerHandler) ContainerReference() (info.ContainerReference, return args.Get(0).(info.ContainerReference), args.Error(1) } +func (self *MockContainerHandler) Cleanup() {} + func (self *MockContainerHandler) GetSpec() (info.ContainerSpec, error) { args := self.Called() return args.Get(0).(info.ContainerSpec), args.Error(1) diff --git a/container/raw/handler.go b/container/raw/handler.go index 3fec8f1bed..4e0a22d363 100644 --- a/container/raw/handler.go +++ b/container/raw/handler.go @@ -166,6 +166,9 @@ func (self *rawContainerHandler) GetRootNetworkDevices() ([]info.NetInfo, error) return nd, nil } +// Nothing to clean up. +func (self *rawContainerHandler) Cleanup() {} + func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) { var spec info.ContainerSpec diff --git a/manager/container.go b/manager/container.go index 83ce090448..2ebae11da1 100644 --- a/manager/container.go +++ b/manager/container.go @@ -373,6 +373,8 @@ func (c *containerData) housekeeping() { for { select { case <-c.stop: + // Cleanup container resources before stopping housekeeping. + c.handler.Cleanup() // Stop housekeeping when signaled. return default: