Net operations already hold locks to containers

Fix a deadlock caused by re-entrant locks on container objects.

Signed-off-by: Fabio Kung <fabio.kung@gmail.com>
This commit is contained in:
Fabio Kung 2017-06-22 07:46:26 -07:00
parent 76d96418b1
commit 37addf0a50
2 changed files with 12 additions and 12 deletions

View file

@ -45,16 +45,6 @@ func (daemon *Daemon) getDNSSearchSettings(container *container.Container) []str
return nil
}
// checkpointAndSave grabs a container lock to safely call container.CheckpointTo
func (daemon *Daemon) checkpointAndSave(container *container.Container) error {
container.Lock()
defer container.Unlock()
if err := container.CheckpointTo(daemon.containersReplica); err != nil {
return fmt.Errorf("Error saving container state: %v", err)
}
return nil
}
func (daemon *Daemon) buildSandboxOptions(container *container.Container) ([]libnetwork.SandboxOption, error) {
var (
sboxOptions []libnetwork.SandboxOption
@ -1017,7 +1007,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName
}
}
return daemon.checkpointAndSave(container)
return container.CheckpointTo(daemon.containersReplica)
}
// DisconnectFromNetwork disconnects container from network n.
@ -1053,7 +1043,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, netw
return err
}
if err := daemon.checkpointAndSave(container); err != nil {
if err := container.CheckpointTo(daemon.containersReplica); err != nil {
return err
}

View file

@ -1233,3 +1233,13 @@ func CreateDaemonRoot(config *config.Config) error {
}
return setupDaemonRoot(config, realRoot, idMappings.RootPair())
}
// checkpointAndSave grabs a container lock to safely call container.CheckpointTo
func (daemon *Daemon) checkpointAndSave(container *container.Container) error {
container.Lock()
defer container.Unlock()
if err := container.CheckpointTo(daemon.containersReplica); err != nil {
return fmt.Errorf("Error saving container state: %v", err)
}
return nil
}