From 4bdb8c03fc9ac4c7c49fd9838d7eccdfd66e1c5b Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 27 Mar 2014 17:41:06 +0100 Subject: [PATCH] graphdriver: Fail initialization if supported but got error If a graphdriver fails initialization due to ErrNotSupported we ignore that and keep trying the next. But if some driver has a different error (for instance if you specified an unknown option for it) we fail the daemon startup, printing the error, rather than falling back to an unexected driver (typically vfs) which may not match what you have run earlier. Docker-DCO-1.1-Signed-off-by: Alexander Larsson (github: alexlarsson) --- daemon/graphdriver/aufs/aufs.go | 2 +- daemon/graphdriver/aufs/aufs_test.go | 2 +- daemon/graphdriver/btrfs/btrfs.go | 2 +- daemon/graphdriver/driver.go | 22 +++++++++++++++------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/daemon/graphdriver/aufs/aufs.go b/daemon/graphdriver/aufs/aufs.go index 12b7a77fb3..2b7aa1b68a 100644 --- a/daemon/graphdriver/aufs/aufs.go +++ b/daemon/graphdriver/aufs/aufs.go @@ -54,7 +54,7 @@ type Driver struct { func Init(root string) (graphdriver.Driver, error) { // Try to load the aufs kernel module if err := supportsAufs(); err != nil { - return nil, err + return nil, graphdriver.ErrNotSupported } paths := []string{ "mnt", diff --git a/daemon/graphdriver/aufs/aufs_test.go b/daemon/graphdriver/aufs/aufs_test.go index 1ffa264aa1..dab5aecc41 100644 --- a/daemon/graphdriver/aufs/aufs_test.go +++ b/daemon/graphdriver/aufs/aufs_test.go @@ -19,7 +19,7 @@ var ( func testInit(dir string, t *testing.T) graphdriver.Driver { d, err := Init(dir) if err != nil { - if err == ErrAufsNotSupported { + if err == graphdriver.ErrNotSupported { t.Skip(err) } else { t.Fatal(err) diff --git a/daemon/graphdriver/btrfs/btrfs.go b/daemon/graphdriver/btrfs/btrfs.go index 4d195537eb..614dc1ff06 100644 --- a/daemon/graphdriver/btrfs/btrfs.go +++ b/daemon/graphdriver/btrfs/btrfs.go @@ -31,7 +31,7 @@ func Init(home string) (graphdriver.Driver, error) { } if buf.Type != 0x9123683E { - return nil, fmt.Errorf("%s is not a btrfs filesystem", rootdir) + return nil, graphdriver.ErrNotSupported } return &Driver{ diff --git a/daemon/graphdriver/driver.go b/daemon/graphdriver/driver.go index 80bf8a0143..96f8d3ab3e 100644 --- a/daemon/graphdriver/driver.go +++ b/daemon/graphdriver/driver.go @@ -1,9 +1,9 @@ package graphdriver import ( + "errors" "fmt" "github.com/dotcloud/docker/archive" - "github.com/dotcloud/docker/utils" "os" "path" ) @@ -43,6 +43,8 @@ var ( "devicemapper", "vfs", } + + ErrNotSupported = errors.New("driver not supported") ) func init() { @@ -62,7 +64,7 @@ func GetDriver(name, home string) (Driver, error) { if initFunc, exists := drivers[name]; exists { return initFunc(path.Join(home, name)) } - return nil, fmt.Errorf("No such driver: %s", name) + return nil, ErrNotSupported } func New(root string) (driver Driver, err error) { @@ -74,9 +76,12 @@ func New(root string) (driver Driver, err error) { // Check for priority drivers first for _, name := range priority { - if driver, err = GetDriver(name, root); err != nil { - utils.Debugf("Error loading driver %s: %s", name, err) - continue + driver, err = GetDriver(name, root) + if err != nil { + if err == ErrNotSupported { + continue + } + return nil, err } return driver, nil } @@ -84,9 +89,12 @@ func New(root string) (driver Driver, err error) { // Check all registered drivers if no priority driver is found for _, initFunc := range drivers { if driver, err = initFunc(root); err != nil { - continue + if err == ErrNotSupported { + continue + } + return nil, err } return driver, nil } - return nil, err + return nil, fmt.Errorf("No supported storage backend found") }