Fix goroutine leak in docker fs handler logic.

Signed-off-by: Vishnu kannan <vishnuk@google.com>
This commit is contained in:
Vishnu kannan 2015-12-04 11:19:49 -08:00
parent 1d6e0ec9bc
commit a6daa760c8
5 changed files with 14 additions and 0 deletions

View File

@ -78,4 +78,7 @@ type ContainerHandler interface {
// Returns whether the container still exists. // Returns whether the container still exists.
Exists() bool Exists() bool
// Cleanup frees up any resources being held like fds or go routines, etc.
Cleanup()
} }

View File

@ -160,6 +160,10 @@ func newDockerContainerHandler(
return handler, nil return handler, nil
} }
func (self *dockerContainerHandler) Cleanup() {
self.fsHandler.stop()
}
func (self *dockerContainerHandler) ContainerReference() (info.ContainerReference, error) { func (self *dockerContainerHandler) ContainerReference() (info.ContainerReference, error) {
return info.ContainerReference{ return info.ContainerReference{
Name: self.name, Name: self.name,

View File

@ -51,6 +51,8 @@ func (self *MockContainerHandler) ContainerReference() (info.ContainerReference,
return args.Get(0).(info.ContainerReference), args.Error(1) return args.Get(0).(info.ContainerReference), args.Error(1)
} }
func (self *MockContainerHandler) Cleanup() {}
func (self *MockContainerHandler) GetSpec() (info.ContainerSpec, error) { func (self *MockContainerHandler) GetSpec() (info.ContainerSpec, error) {
args := self.Called() args := self.Called()
return args.Get(0).(info.ContainerSpec), args.Error(1) return args.Get(0).(info.ContainerSpec), args.Error(1)

View File

@ -166,6 +166,9 @@ func (self *rawContainerHandler) GetRootNetworkDevices() ([]info.NetInfo, error)
return nd, nil return nd, nil
} }
// Nothing to clean up.
func (self *rawContainerHandler) Cleanup() {}
func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) { func (self *rawContainerHandler) GetSpec() (info.ContainerSpec, error) {
var spec info.ContainerSpec var spec info.ContainerSpec

View File

@ -373,6 +373,8 @@ func (c *containerData) housekeeping() {
for { for {
select { select {
case <-c.stop: case <-c.stop:
// Cleanup container resources before stopping housekeeping.
c.handler.Cleanup()
// Stop housekeeping when signaled. // Stop housekeeping when signaled.
return return
default: default: