cmd/dockerd: Rewrite shutdownDaemon to use context timeout

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
This commit is contained in:
Cory Snider 2022-10-28 15:20:03 +02:00 committed by Paweł Gronowski
parent 66a0289081
commit 2006d9f7d1
No known key found for this signature in database
GPG key ID: B85EFCFE26DEF92A

View file

@ -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{})
go func() {
d.Shutdown(ctx)
close(ch)
}()
if shutdownTimeout < 0 {
<-ch
logrus.Debug("Clean shutdown succeeded")
return
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)
}
timeout := time.NewTimer(time.Duration(shutdownTimeout) * time.Second)
defer timeout.Stop()
go func() {
defer cancel()
d.Shutdown(ctx)
}()
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")
}
}