Browse code

daemon: register container as late as possible

fixes races between list and create

Signed-off-by: Alexander Morozov <lk4d4@docker.com>

Alexander Morozov authored on 2016/03/30 05:52:18
Showing 1 changed files
... ...
@@ -74,8 +74,8 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig) (retC *containe
74 74
 	}
75 75
 	defer func() {
76 76
 		if retErr != nil {
77
-			if err := daemon.ContainerRm(container.ID, &types.ContainerRmConfig{ForceRemove: true}); err != nil {
78
-				logrus.Errorf("Clean up Error! Cannot destroy container %s: %v", container.ID, err)
77
+			if err := daemon.cleanupContainer(container, true); err != nil {
78
+				logrus.Errorf("failed to cleanup container on create error: %v", err)
79 79
 			}
80 80
 		}
81 81
 	}()
... ...
@@ -91,9 +91,6 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig) (retC *containe
91 91
 		return nil, err
92 92
 	}
93 93
 
94
-	if err := daemon.Register(container); err != nil {
95
-		return nil, err
96
-	}
97 94
 	rootUID, rootGID, err := idtools.GetRootUIDGID(daemon.uidMaps, daemon.gidMaps)
98 95
 	if err != nil {
99 96
 		return nil, err
... ...
@@ -126,10 +123,13 @@ func (daemon *Daemon) create(params types.ContainerCreateConfig) (retC *containe
126 126
 		return nil, err
127 127
 	}
128 128
 
129
-	if err := container.ToDiskLocking(); err != nil {
129
+	if err := container.ToDisk(); err != nil {
130 130
 		logrus.Errorf("Error saving new container to disk: %v", err)
131 131
 		return nil, err
132 132
 	}
133
+	if err := daemon.Register(container); err != nil {
134
+		return nil, err
135
+	}
133 136
 	daemon.LogContainerEvent(container, "create")
134 137
 	return container, nil
135 138
 }