From ef8df00e6a651b26f886bc527012a2db9b187173 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Thu, 17 Aug 2017 10:23:54 -0400 Subject: [PATCH] kpod: shut down the storage library before exiting Before exiting, have kpod shut down the storage library if it can. This should keep us from leaving mountpoints for the root (for non-vfs cases) and run directory (with newer containers/storage) busy when testing kpod. Signed-off-by: Nalin Dahyabhai --- cmd/kpod/common.go | 13 +++++++++++++ cmd/kpod/diff.go | 1 + cmd/kpod/inspect.go | 1 + cmd/kpod/logs.go | 1 + cmd/kpod/main.go | 12 +++++++++++- cmd/kpod/rename.go | 1 + cmd/kpod/stats.go | 1 + libkpod/container_server.go | 5 ++++- 8 files changed, 33 insertions(+), 2 deletions(-) diff --git a/cmd/kpod/common.go b/cmd/kpod/common.go index 6d1f5299..d9aab97a 100644 --- a/cmd/kpod/common.go +++ b/cmd/kpod/common.go @@ -10,6 +10,10 @@ import ( "github.com/urfave/cli" ) +var ( + stores = make(map[storage.Store]struct{}) +) + func getStore(c *libkpod.Config) (storage.Store, error) { options := storage.DefaultStoreOptions options.GraphRoot = c.Root @@ -22,9 +26,18 @@ func getStore(c *libkpod.Config) (storage.Store, error) { return nil, err } is.Transport.SetStore(store) + stores[store] = struct{}{} return store, nil } +func shutdownStores() { + for store := range stores { + if _, err := store.Shutdown(false); err != nil { + break + } + } +} + func getConfig(c *cli.Context) (*libkpod.Config, error) { config := libkpod.DefaultConfig() if c.GlobalIsSet("config") { diff --git a/cmd/kpod/diff.go b/cmd/kpod/diff.go index f8592e71..fa8c1d56 100644 --- a/cmd/kpod/diff.go +++ b/cmd/kpod/diff.go @@ -86,6 +86,7 @@ func diffCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() to := c.Args().Get(0) changes, err := server.GetDiff("", to) diff --git a/cmd/kpod/inspect.go b/cmd/kpod/inspect.go index fe8d53b7..5371a495 100644 --- a/cmd/kpod/inspect.go +++ b/cmd/kpod/inspect.go @@ -71,6 +71,7 @@ func inspectCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() if err = server.Update(); err != nil { return errors.Wrapf(err, "could not update list of containers") } diff --git a/cmd/kpod/logs.go b/cmd/kpod/logs.go index 013f7642..995f91cd 100644 --- a/cmd/kpod/logs.go +++ b/cmd/kpod/logs.go @@ -69,6 +69,7 @@ func logsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not create container server") } + defer server.Shutdown() err = server.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/cmd/kpod/main.go b/cmd/kpod/main.go index 7ee6d854..2aa29845 100644 --- a/cmd/kpod/main.go +++ b/cmd/kpod/main.go @@ -50,6 +50,16 @@ func main() { } return nil } + app.After = func(*cli.Context) error { + // called by Run() when the command handler succeeds + shutdownStores() + return nil + } + cli.OsExiter = func(code int) { + // called by Run() when the command fails, bypassing After() + shutdownStores() + os.Exit(code) + } app.Flags = []cli.Flag{ cli.StringFlag{ Name: "config, c", @@ -82,6 +92,6 @@ func main() { } if err := app.Run(os.Args); err != nil { logrus.Errorf(err.Error()) - os.Exit(1) + cli.OsExiter(1) } } diff --git a/cmd/kpod/rename.go b/cmd/kpod/rename.go index 8ef63419..fe1f08d9 100644 --- a/cmd/kpod/rename.go +++ b/cmd/kpod/rename.go @@ -32,6 +32,7 @@ func renameCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not get container server") } + defer server.Shutdown() err = server.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/cmd/kpod/stats.go b/cmd/kpod/stats.go index 10269f71..416acc93 100644 --- a/cmd/kpod/stats.go +++ b/cmd/kpod/stats.go @@ -70,6 +70,7 @@ func statsCmd(c *cli.Context) error { if err != nil { return errors.Wrapf(err, "could not create container server") } + defer containerServer.Shutdown() err = containerServer.Update() if err != nil { return errors.Wrapf(err, "could not update list of containers") diff --git a/libkpod/container_server.go b/libkpod/container_server.go index a495753e..3cf5e90b 100644 --- a/libkpod/container_server.go +++ b/libkpod/container_server.go @@ -570,7 +570,10 @@ func (c *ContainerServer) ReleasePodName(name string) { // Shutdown attempts to shut down the server's storage cleanly func (c *ContainerServer) Shutdown() error { _, err := c.store.Shutdown(false) - return err + if err != nil && errors.Cause(err) != cstorage.ErrLayerUsedByContainer { + return err + } + return nil } type containerServerState struct {