From eae5cf1e20e8d93cc13ea8e1db3cd787250fa76d Mon Sep 17 00:00:00 2001 From: LK4D4 Date: Fri, 11 Jul 2014 21:49:24 +0400 Subject: [PATCH] Use container.Lock in public ToDisk method Here was possible race with inspect where we changing HostConfig.Links Docker-DCO-1.1-Signed-off-by: Alexandr Morozov (github: LK4D4) --- daemon/container.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/daemon/container.go b/daemon/container.go index 419314b8ba..10a8caa082 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -106,7 +106,7 @@ func (container *Container) FromDisk() error { return container.readHostConfig() } -func (container *Container) ToDisk() error { +func (container *Container) toDisk() error { data, err := json.Marshal(container) if err != nil { return err @@ -125,6 +125,13 @@ func (container *Container) ToDisk() error { return container.WriteHostConfig() } +func (container *Container) ToDisk() error { + container.Lock() + err := container.toDisk() + container.Unlock() + return err +} + func (container *Container) readHostConfig() error { container.hostConfig = &runconfig.HostConfig{} // If the hostconfig file does not exist, do not read it. @@ -482,7 +489,7 @@ func (container *Container) monitor(callback execdriver.StartCallback) error { // FIXME: here is race condition between two RUN instructions in Dockerfile // because they share same runconfig and change image. Must be fixed // in server/buildfile.go - if err := container.ToDisk(); err != nil { + if err := container.toDisk(); err != nil { utils.Errorf("Error dumping container %s state to disk: %s\n", container.ID, err) } } @@ -1081,7 +1088,7 @@ func (container *Container) waitForStart() error { c.Close() } } - if err := container.ToDisk(); err != nil { + if err := container.toDisk(); err != nil { utils.Debugf("%s", err) } container.State.SetRunning(command.Pid())