Pārlūkot izejas kodu

cmd/dockerd: Rewrite shutdownDaemon to use context timeout

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Cory Snider 2 gadi atpakaļ
vecāks
revīzija
2006d9f7d1
1 mainītis faili ar 12 papildinājumiem un 15 dzēšanām
  1. 12 15
      cmd/dockerd/daemon.go

+ 12 - 15
cmd/dockerd/daemon.go

@@ -360,26 +360,23 @@ func (cli *DaemonCli) stop() {
 // d.Shutdown() is waiting too long to kill container or worst it's
 // blocked there
 func shutdownDaemon(ctx context.Context, d *daemon.Daemon) {
-	shutdownTimeout := d.ShutdownTimeout()
-	ch := make(chan struct{})
+	var cancel context.CancelFunc
+	if timeout := d.ShutdownTimeout(); timeout >= 0 {
+		ctx, cancel = context.WithTimeout(ctx, time.Duration(timeout)*time.Second)
+	} else {
+		ctx, cancel = context.WithCancel(ctx)
+	}
+
 	go func() {
+		defer cancel()
 		d.Shutdown(ctx)
-		close(ch)
 	}()
-	if shutdownTimeout < 0 {
-		<-ch
-		logrus.Debug("Clean shutdown succeeded")
-		return
-	}
 
-	timeout := time.NewTimer(time.Duration(shutdownTimeout) * time.Second)
-	defer timeout.Stop()
-
-	select {
-	case <-ch:
-		logrus.Debug("Clean shutdown succeeded")
-	case <-timeout.C:
+	<-ctx.Done()
+	if errors.Is(ctx.Err(), context.DeadlineExceeded) {
 		logrus.Error("Force shutdown daemon")
+	} else {
+		logrus.Debug("Clean shutdown succeeded")
 	}
 }