diff --git a/daemon/monitor.go b/daemon/monitor.go index ec9ca585a6..95e7af3e1b 100644 --- a/daemon/monitor.go +++ b/daemon/monitor.go @@ -54,10 +54,7 @@ func (daemon *Daemon) StateChanged(id string, e libcontainerd.StateInfo) error { "exitCode": strconv.Itoa(int(e.ExitCode)), } daemon.LogContainerEventWithAttributes(c, "die", attributes) - if err := c.ToDisk(); err != nil { - return err - } - return daemon.postRunProcessing(c, e) + return c.ToDisk() case libcontainerd.StateExitProcess: c.Lock() defer c.Unlock() diff --git a/libcontainerd/client_windows.go b/libcontainerd/client_windows.go index 1a96d0b6f7..fac9a35683 100644 --- a/libcontainerd/client_windows.go +++ b/libcontainerd/client_windows.go @@ -344,6 +344,8 @@ func (clnt *client) Signal(containerID string, sig int) error { return err } + cont.manualStopRequested = true + logrus.Debugf("lcd: Signal() containerID=%s sig=%d pid=%d", containerID, sig, cont.systemPid) context := fmt.Sprintf("Signal: sig=%d pid=%d", sig, cont.systemPid) @@ -352,7 +354,6 @@ func (clnt *client) Signal(containerID string, sig int) error { if err := hcsshim.TerminateComputeSystem(containerID, hcsshim.TimeoutInfinite, context); err != nil { logrus.Errorf("Failed to terminate %s - %q", containerID, err) } - } else { // Terminate Process if err = hcsshim.TerminateProcessInComputeSystem(containerID, cont.systemPid); err != nil { @@ -360,24 +361,8 @@ func (clnt *client) Signal(containerID string, sig int) error { // Ignore errors err = nil } - - // Shutdown the compute system - const shutdownTimeout = 5 * 60 * 1000 // 5 minutes - if err := hcsshim.ShutdownComputeSystem(containerID, shutdownTimeout, context); err != nil { - if herr, ok := err.(*hcsshim.HcsError); !ok || - (herr.Err != hcsshim.ERROR_SHUTDOWN_IN_PROGRESS && - herr.Err != ErrorBadPathname && - herr.Err != syscall.ERROR_PATH_NOT_FOUND) { - logrus.Debugf("signal - error from ShutdownComputeSystem %v on %s. Calling TerminateComputeSystem", err, containerID) - if err := hcsshim.TerminateComputeSystem(containerID, shutdownTimeout, "signal"); err != nil { - logrus.Debugf("signal - ignoring error from TerminateComputeSystem on %s %v", containerID, err) - } else { - logrus.Debugf("Successful TerminateComputeSystem after failed ShutdownComputeSystem on %s during signal %v", containerID, sig) - } - } - logrus.Errorf("Failed to shutdown %s - %q", containerID, err) - } } + return nil } diff --git a/libcontainerd/container_windows.go b/libcontainerd/container_windows.go index 650fe73f09..ec35746b5c 100644 --- a/libcontainerd/container_windows.go +++ b/libcontainerd/container_windows.go @@ -20,6 +20,8 @@ type container struct { // but can be called from the RestartManager context which does not // otherwise have access to the Spec ociSpec Spec + + manualStopRequested bool } func (ctr *container) newProcess(friendlyName string) *process { @@ -163,11 +165,10 @@ func (ctr *container) waitExit(pid uint32, processFriendlyName string, isFirstPr // But it could have been an exec'd process which exited if !isFirstProcessToStart { si.State = StateExitProcess - } + } else { + // Since this is the init process, always call into vmcompute.dll to + // shutdown the container after we have completed. - // If this is the init process, always call into vmcompute.dll to - // shutdown the container after we have completed. - if isFirstProcessToStart { propertyCheckFlag := 1 // Include update pending check. csProperties, err := hcsshim.GetComputeSystemProperties(ctr.containerID, uint32(propertyCheckFlag)) if err != nil { @@ -196,7 +197,7 @@ func (ctr *container) waitExit(pid uint32, processFriendlyName string, isFirstPr logrus.Debugf("Completed shutting down container %s", ctr.containerID) } - if si.State == StateExit && ctr.restartManager != nil { + if !ctr.manualStopRequested && ctr.restartManager != nil { restart, wait, err := ctr.restartManager.ShouldRestart(uint32(exitCode), false, time.Since(ctr.startedAt)) if err != nil { logrus.Error(err)