From ca54b617a044f62ad60d87a88cfc4ddbedbf16e2 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Wed, 22 Jul 2015 21:14:39 +0500 Subject: [PATCH] try mount state run bootstrap if failed (and autoformat if we can), then try again --- init/bootstrap.go | 4 ---- init/init.go | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/init/bootstrap.go b/init/bootstrap.go index 0aaa7eaf..019c7f8d 100644 --- a/init/bootstrap.go +++ b/init/bootstrap.go @@ -68,10 +68,6 @@ func stopDocker(c chan interface{}) error { } func bootstrap(cfg *config.Config) error { - if util.ResolveDevice(cfg.State.Dev) != "" { - return nil - } - log.Info("Launching Bootstrap Docker") c, err := startDocker(cfg) if err != nil { diff --git a/init/init.go b/init/init.go index 5c56f24d..bbefbeda 100644 --- a/init/init.go +++ b/init/init.go @@ -249,11 +249,21 @@ func MainInit() { } } +func mountStateTmpfs(cfg *config.Config) error { + log.Debugf("State will not be persisted") + return util.Mount("none", STATE, "tmpfs", "") +} + func mountState(cfg *config.Config) error { var err error if cfg.State.Dev != "" { dev := util.ResolveDevice(cfg.State.Dev) + if dev == "" { + msg := fmt.Sprintf("Could not resolve device %q", cfg.State.Dev) + log.Infof(msg) + return fmt.Errorf(msg) + } log.Infof("Mounting state device %s to %s", dev, STATE) fsType := cfg.State.FsType @@ -265,20 +275,31 @@ func mountState(cfg *config.Config) error { log.Debugf("FsType has been set to %s", fsType) err = util.Mount(dev, STATE, fsType, "") } - } - - if err != nil && cfg.State.Required { - return err - } - - if err != nil || cfg.State.Dev == "" { - log.Debugf("State will not be persisted") - err = util.Mount("none", STATE, "tmpfs", "") + } else { + return mountStateTmpfs(cfg) } return err } +func tryMountAndBootstrap(cfg *config.Config) error { + if err := mountState(cfg); err != nil { + if err := bootstrap(cfg); err != nil { + if cfg.State.Required { + return err + } + return mountStateTmpfs(cfg) + } + if err := mountState(cfg); err != nil { + if cfg.State.Required { + return err + } + return mountStateTmpfs(cfg) + } + } + return nil +} + func createGroups(cfg *config.Config) error { return ioutil.WriteFile("/etc/group", []byte("root:x:0:\n"), 0644) } @@ -354,8 +375,7 @@ func RunInit() error { loadModules, setResolvConf, setupSystemBridge, - bootstrap, - mountState, + tryMountAndBootstrap, func(cfg *config.Config) error { return cfg.Reload() },