From ce9e9ff4a101eec5632704003fae772e8762eb15 Mon Sep 17 00:00:00 2001 From: Alexandr Morozov Date: Thu, 29 May 2014 16:26:52 +0400 Subject: [PATCH] Fix race on shutting down Docker-DCO-1.1-Signed-off-by: Alexandr Morozov (github: LK4D4) --- server/server.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server/server.go b/server/server.go index b817068369..85f1125ba6 100644 --- a/server/server.go +++ b/server/server.go @@ -39,6 +39,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "syscall" "time" @@ -87,17 +88,17 @@ func InitServer(job *engine.Job) engine.Status { c := make(chan os.Signal, 1) gosignal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT) go func() { - interruptCount := 0 + interruptCount := uint32(0) for sig := range c { - go func() { + go func(sig os.Signal) { log.Printf("Received signal '%v', starting shutdown of docker...\n", sig) switch sig { case os.Interrupt, syscall.SIGTERM: // If the user really wants to interrupt, let him do so. - if interruptCount < 3 { - interruptCount++ + if atomic.LoadUint32(&interruptCount) < 3 { + atomic.AddUint32(&interruptCount, 1) // Initiate the cleanup only once - if interruptCount == 1 { + if atomic.LoadUint32(&interruptCount) == 1 { utils.RemovePidFile(srv.daemon.Config().Pidfile) srv.Close() } else { @@ -109,7 +110,7 @@ func InitServer(job *engine.Job) engine.Status { case syscall.SIGQUIT: } os.Exit(128 + int(sig.(syscall.Signal))) - }() + }(sig) } }() job.Eng.Hack_SetGlobalVar("httpapi.server", srv)