From f59593cbd1c177fe2d5a1b1f00efe9987d25a526 Mon Sep 17 00:00:00 2001 From: John Howard Date: Thu, 2 Mar 2017 15:12:14 -0800 Subject: [PATCH] Windows: Cleanup HCS on restore Signed-off-by: John Howard This ensures that any compute processes in HCS are cleanedup during daemon restore. Note Windows cannot (currently) reconnect to containers on restore. --- libcontainerd/client_windows.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libcontainerd/client_windows.go b/libcontainerd/client_windows.go index cf55ac2d4d..b7c6e1906c 100644 --- a/libcontainerd/client_windows.go +++ b/libcontainerd/client_windows.go @@ -557,8 +557,22 @@ func (clnt *client) Stats(containerID string) (*Stats, error) { // Restore is the handler for restoring a container func (clnt *client) Restore(containerID string, _ StdioCallback, unusedOnWindows ...CreateOption) error { - // TODO Windows: Implement this. For now, just tell the backend the container exited. logrus.Debugf("libcontainerd: Restore(%s)", containerID) + + // TODO Windows: On RS1, a re-attach isn't possible. + // However, there is a scenario in which there is an issue. + // Consider a background container. The daemon dies unexpectedly. + // HCS will still have the compute service alive and running. + // For consistence, we call in to shoot it regardless if HCS knows about it + // We explicitly just log a warning if the terminate fails. + // Then we tell the backend the container exited. + if hc, err := hcsshim.OpenContainer(containerID); err == nil { + if err := hc.Terminate(); err != nil { + if !hcsshim.IsPending(err) { + logrus.Warnf("libcontainerd: failed to terminate %s on restore - %q", containerID, err) + } + } + } return clnt.backend.StateChanged(containerID, StateInfo{ CommonStateInfo: CommonStateInfo{ State: StateExit,