浏览代码

handleContainerExit: put a timeout on containerd DeleteTask

Also move c.Lock() below containerd delete task, as it doesn't seem that
there is any necessity to hold the container lock while containerd is
killing the task.

This fixes a potential edge-case where containerd delete task hangs, and
thereafter all operations on the container would hang forever, as this
function is holding onto the container lock.

Signed-off-by: Cam <gh@sparr.email>
Cam 4 年之前
父节点
当前提交
05c20a6e1c
共有 1 个文件被更改,包括 6 次插入4 次删除
  1. 6 4
      daemon/monitor.go

+ 6 - 4
daemon/monitor.go

@@ -26,15 +26,17 @@ func (daemon *Daemon) setStateCounter(c *container.Container) {
 
 func (daemon *Daemon) handleContainerExit(c *container.Container, e *libcontainerdtypes.EventInfo) error {
 	c.Lock()
-
-	ec, et, err := daemon.containerd.DeleteTask(context.Background(), c.ID)
+	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
+	ec, et, err := daemon.containerd.DeleteTask(ctx, c.ID)
+	cancel()
 	if err != nil {
-		logrus.WithError(err).Warnf("failed to delete container %s from containerd", c.ID)
+		logrus.WithError(err).WithField("container", c.ID).Warnf("failed to delete container from containerd")
 	}
 
-	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
+	ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)
 	c.StreamConfig.Wait(ctx)
 	cancel()
+
 	c.Reset(false)
 
 	exitStatus := container.ExitStatus{