Explorar el Código

Merge pull request #5571 from vieux/fix_race_docker_daemon

Fix race docker daemon
Victor Vieux hace 11 años
padre
commit
00ce30bc74
Se han modificado 3 ficheros con 14 adiciones y 7 borrados
  1. 9 6
      api/server/server.go
  2. 4 1
      builtins/builtins.go
  3. 1 0
      docker/docker.go

+ 9 - 6
api/server/server.go

@@ -1189,6 +1189,7 @@ func changeGroup(addr string, nameOrGid string) error {
 // ListenAndServe sets up the required http.Server and gets it listening for
 // ListenAndServe sets up the required http.Server and gets it listening for
 // each addr passed in and does protocol specific checking.
 // each addr passed in and does protocol specific checking.
 func ListenAndServe(proto, addr string, job *engine.Job) error {
 func ListenAndServe(proto, addr string, job *engine.Job) error {
+	var l net.Listener
 	r, err := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
 	r, err := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("Version"))
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -1204,7 +1205,11 @@ func ListenAndServe(proto, addr string, job *engine.Job) error {
 		}
 		}
 	}
 	}
 
 
-	l, err := listenbuffer.NewListenBuffer(proto, addr, activationLock)
+	if job.GetenvBool("BufferRequests") {
+		l, err = listenbuffer.NewListenBuffer(proto, addr, activationLock)
+	} else {
+		l, err = net.Listen(proto, addr)
+	}
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -1276,10 +1281,6 @@ func ServeApi(job *engine.Job) engine.Status {
 	)
 	)
 	activationLock = make(chan struct{})
 	activationLock = make(chan struct{})
 
 
-	if err := job.Eng.Register("acceptconnections", AcceptConnections); err != nil {
-		return job.Error(err)
-	}
-
 	for _, protoAddr := range protoAddrs {
 	for _, protoAddr := range protoAddrs {
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
 		protoAddrParts := strings.SplitN(protoAddr, "://", 2)
 		if len(protoAddrParts) != 2 {
 		if len(protoAddrParts) != 2 {
@@ -1306,7 +1307,9 @@ func AcceptConnections(job *engine.Job) engine.Status {
 	go systemd.SdNotify("READY=1")
 	go systemd.SdNotify("READY=1")
 
 
 	// close the lock so the listeners start accepting connections
 	// close the lock so the listeners start accepting connections
-	close(activationLock)
+	if activationLock != nil {
+		close(activationLock)
+	}
 
 
 	return engine.StatusOK
 	return engine.StatusOK
 }
 }

+ 4 - 1
builtins/builtins.go

@@ -28,7 +28,10 @@ func Register(eng *engine.Engine) error {
 
 
 // remote: a RESTful api for cross-docker communication
 // remote: a RESTful api for cross-docker communication
 func remote(eng *engine.Engine) error {
 func remote(eng *engine.Engine) error {
-	return eng.Register("serveapi", apiserver.ServeApi)
+	if err := eng.Register("serveapi", apiserver.ServeApi); err != nil {
+		return err
+	}
+	return eng.Register("acceptconnections", apiserver.AcceptConnections)
 }
 }
 
 
 // daemon: a default execution and storage backend for Docker on Linux,
 // daemon: a default execution and storage backend for Docker on Linux,

+ 1 - 0
docker/docker.go

@@ -185,6 +185,7 @@ func main() {
 		job.Setenv("TlsCa", *flCa)
 		job.Setenv("TlsCa", *flCa)
 		job.Setenv("TlsCert", *flCert)
 		job.Setenv("TlsCert", *flCert)
 		job.Setenv("TlsKey", *flKey)
 		job.Setenv("TlsKey", *flKey)
+		job.SetenvBool("BufferRequests", true)
 		if err := job.Run(); err != nil {
 		if err := job.Run(); err != nil {
 			log.Fatal(err)
 			log.Fatal(err)
 		}
 		}