diff options
Diffstat (limited to 'runsc')
-rw-r--r-- | runsc/boot/controller.go | 5 | ||||
-rw-r--r-- | runsc/boot/loader.go | 7 | ||||
-rw-r--r-- | runsc/sandbox/sandbox.go | 6 |
3 files changed, 15 insertions, 3 deletions
diff --git a/runsc/boot/controller.go b/runsc/boot/controller.go index d52cf5a00..b605aa40a 100644 --- a/runsc/boot/controller.go +++ b/runsc/boot/controller.go @@ -15,6 +15,7 @@ package boot import ( + "context" "errors" "fmt" "os" @@ -165,8 +166,8 @@ func newController(fd int, l *Loader) (*controller, error) { return ctrl, nil } -func (c *controller) stop() { - c.srv.Stop() +func (c *controller) stop(ctx context.Context) { + c.srv.Stop(ctx) } // containerManager manages sandbox containers. diff --git a/runsc/boot/loader.go b/runsc/boot/loader.go index 8d71d7447..d8282d1d1 100644 --- a/runsc/boot/loader.go +++ b/runsc/boot/loader.go @@ -16,6 +16,7 @@ package boot import ( + gcontext "context" "errors" "fmt" mrand "math/rand" @@ -468,6 +469,8 @@ func createProcessArgs(id string, spec *specs.Spec, creds *auth.Credentials, k * return procArgs, nil } +const destroyTimeout = 15 * gtime.Second + // Destroy cleans up all resources used by the loader. // // Note that this will block until all open control server connections have @@ -482,7 +485,9 @@ func (l *Loader) Destroy() { // Stop the control server. This will indirectly stop any // long-running control operations that are in flight, e.g. // profiling operations. - l.ctrl.stop() + ctx, cancel := gcontext.WithTimeout(context.Background(), destroyTimeout) + defer cancel() + l.ctrl.stop(ctx) // Release all kernel resources. This is only safe after we can no longer // save/restore. diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index 29e202b7d..f14cc7229 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -797,7 +797,13 @@ func (s *Sandbox) Wait(cid string) (unix.WaitStatus, error) { // Try the Wait RPC to the sandbox. var ws unix.WaitStatus err = conn.Call(boot.ContainerWait, &cid, &ws) + conn.Close() if err == nil { + if s.IsRootContainer(cid) { + if err := s.waitForStopped(); err != nil { + return unix.WaitStatus(0), err + } + } // It worked! return ws, nil } |