Browse code

Merge pull request #5571 from vieux/fix_race_docker_daemon

Fix race docker daemon

Victor Vieux authored on 2014/05/17 05:57:43
Showing 3 changed files
... ...
@@ -1189,6 +1189,7 @@ func changeGroup(addr string, nameOrGid string) error {
1189 1189
 // ListenAndServe sets up the required http.Server and gets it listening for
1190 1190
 // each addr passed in and does protocol specific checking.
1191 1191
 func ListenAndServe(proto, addr string, job *engine.Job) error {
1192
+	var l net.Listener
1192 1193
 	r, err := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
1193 1194
 	if err != nil {
1194 1195
 		return err
... ...
@@ -1204,7 +1205,11 @@ func ListenAndServe(proto, addr string, job *engine.Job) error {
1204 1204
 		}
1205 1205
 	}
1206 1206
 
1207
-	l, err := listenbuffer.NewListenBuffer(proto, addr, activationLock)
1207
+	if job.GetenvBool("BufferRequests") {
1208
+		l, err = listenbuffer.NewListenBuffer(proto, addr, activationLock)
1209
+	} else {
1210
+		l, err = net.Listen(proto, addr)
1211
+	}
1208 1212
 	if err != nil {
1209 1213
 		return err
1210 1214
 	}
... ...
@@ -1276,10 +1281,6 @@ func ServeApi(job *engine.Job) engine.Status {
1276 1276
 	)
1277 1277
 	activationLock = make(chan struct{})
1278 1278
 
1279
-	if err := job.Eng.Register("acceptconnections", AcceptConnections); err != nil {
1280
-		return job.Error(err)
1281
-	}
1282
-
1283 1279
 	for _, protoAddr := range protoAddrs {
1284 1280
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
1285 1281
 		if len(protoAddrParts) != 2 {
... ...
@@ -1306,7 +1307,9 @@ func AcceptConnections(job *engine.Job) engine.Status {
1306 1306
 	go systemd.SdNotify("READY=1")
1307 1307
 
1308 1308
 	// close the lock so the listeners start accepting connections
1309
-	close(activationLock)
1309
+	if activationLock != nil {
1310
+		close(activationLock)
1311
+	}
1310 1312
 
1311 1313
 	return engine.StatusOK
1312 1314
 }
... ...
@@ -28,7 +28,10 @@ func Register(eng *engine.Engine) error {
28 28
 
29 29
 // remote: a RESTful api for cross-docker communication
30 30
 func remote(eng *engine.Engine) error {
31
-	return eng.Register("serveapi", apiserver.ServeApi)
31
+	if err := eng.Register("serveapi", apiserver.ServeApi); err != nil {
32
+		return err
33
+	}
34
+	return eng.Register("acceptconnections", apiserver.AcceptConnections)
32 35
 }
33 36
 
34 37
 // daemon: a default execution and storage backend for Docker on Linux,
... ...
@@ -185,6 +185,7 @@ func main() {
185 185
 		job.Setenv("TlsCa", *flCa)
186 186
 		job.Setenv("TlsCert", *flCert)
187 187
 		job.Setenv("TlsKey", *flKey)
188
+		job.SetenvBool("BufferRequests", true)
188 189
 		if err := job.Run(); err != nil {
189 190
 			log.Fatal(err)
190 191
 		}