Browse code

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>

Fabio Kung authored on 2017/06/22 23:46:26
Showing 2 changed files
... ...
@@ -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
+}