Fix a deadlock caused by re-entrant locks on container objects.
Signed-off-by: Fabio Kung <fabio.kung@gmail.com>
| ... | ... |
@@ -45,16 +45,6 @@ func (daemon *Daemon) getDNSSearchSettings(container *container.Container) []str |
| 45 | 45 |
return nil |
| 46 | 46 |
} |
| 47 | 47 |
|
| 48 |
-// checkpointAndSave grabs a container lock to safely call container.CheckpointTo |
|
| 49 |
-func (daemon *Daemon) checkpointAndSave(container *container.Container) error {
|
|
| 50 |
- container.Lock() |
|
| 51 |
- defer container.Unlock() |
|
| 52 |
- if err := container.CheckpointTo(daemon.containersReplica); err != nil {
|
|
| 53 |
- return fmt.Errorf("Error saving container state: %v", err)
|
|
| 54 |
- } |
|
| 55 |
- return nil |
|
| 56 |
-} |
|
| 57 |
- |
|
| 58 | 48 |
func (daemon *Daemon) buildSandboxOptions(container *container.Container) ([]libnetwork.SandboxOption, error) {
|
| 59 | 49 |
var ( |
| 60 | 50 |
sboxOptions []libnetwork.SandboxOption |
| ... | ... |
@@ -1017,7 +1007,7 @@ func (daemon *Daemon) ConnectToNetwork(container *container.Container, idOrName |
| 1017 | 1017 |
} |
| 1018 | 1018 |
} |
| 1019 | 1019 |
|
| 1020 |
- return daemon.checkpointAndSave(container) |
|
| 1020 |
+ return container.CheckpointTo(daemon.containersReplica) |
|
| 1021 | 1021 |
} |
| 1022 | 1022 |
|
| 1023 | 1023 |
// DisconnectFromNetwork disconnects container from network n. |
| ... | ... |
@@ -1053,7 +1043,7 @@ func (daemon *Daemon) DisconnectFromNetwork(container *container.Container, netw |
| 1053 | 1053 |
return err |
| 1054 | 1054 |
} |
| 1055 | 1055 |
|
| 1056 |
- if err := daemon.checkpointAndSave(container); err != nil {
|
|
| 1056 |
+ if err := container.CheckpointTo(daemon.containersReplica); err != nil {
|
|
| 1057 | 1057 |
return err |
| 1058 | 1058 |
} |
| 1059 | 1059 |
|
| ... | ... |
@@ -1233,3 +1233,13 @@ func CreateDaemonRoot(config *config.Config) error {
|
| 1233 | 1233 |
} |
| 1234 | 1234 |
return setupDaemonRoot(config, realRoot, idMappings.RootPair()) |
| 1235 | 1235 |
} |
| 1236 |
+ |
|
| 1237 |
+// checkpointAndSave grabs a container lock to safely call container.CheckpointTo |
|
| 1238 |
+func (daemon *Daemon) checkpointAndSave(container *container.Container) error {
|
|
| 1239 |
+ container.Lock() |
|
| 1240 |
+ defer container.Unlock() |
|
| 1241 |
+ if err := container.CheckpointTo(daemon.containersReplica); err != nil {
|
|
| 1242 |
+ return fmt.Errorf("Error saving container state: %v", err)
|
|
| 1243 |
+ } |
|
| 1244 |
+ return nil |
|
| 1245 |
+} |