From a83a76934787a20e96389d33bd56a09369f9b808 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 29 Jul 2015 16:49:05 -0700 Subject: [PATCH] Simplify and fix os.MkdirAll() usage TL;DR: check for IsExist(err) after a failed MkdirAll() is both redundant and wrong -- so two reasons to remove it. Quoting MkdirAll documentation: > MkdirAll creates a directory named path, along with any necessary > parents, and returns nil, or else returns an error. If path > is already a directory, MkdirAll does nothing and returns nil. This means two things: 1. If a directory to be created already exists, no error is returned. 2. If the error returned is IsExist (EEXIST), it means there exists a non-directory with the same name as MkdirAll need to use for directory. Example: we want to MkdirAll("a/b"), but file "a" (or "a/b") already exists, so MkdirAll fails. The above is a theory, based on quoted documentation and my UNIX knowledge. 3. In practice, though, current MkdirAll implementation [1] returns ENOTDIR in most of cases described in #2, with the exception when there is a race between MkdirAll and someone else creating the last component of MkdirAll argument as a file. In this very case MkdirAll() will indeed return EEXIST. Because of #1, IsExist check after MkdirAll is not needed. Because of #2 and #3, ignoring IsExist error is just plain wrong, as directory we require is not created. It's cleaner to report the error now. Note this error is all over the tree, I guess due to copy-paste, or trying to follow the same usage pattern as for Mkdir(), or some not quite correct examples on the Internet. [v2: a separate aufs commit is merged into this one] [1] https://github.com/golang/go/blob/f9ed2f75/src/os/path.go Signed-off-by: Kir Kolyshkin --- daemon/daemon.go | 6 +++--- daemon/graphdriver/aufs/aufs.go | 8 ++------ daemon/graphdriver/devmapper/deviceset.go | 4 ++-- daemon/graphdriver/devmapper/driver.go | 4 ++-- daemon/graphdriver/overlay/overlay.go | 2 +- daemon/graphdriver/zfs/zfs.go | 2 +- graph/graph.go | 2 +- integration-cli/docker_utils.go | 2 +- pkg/archive/archive.go | 4 ++-- 9 files changed, 15 insertions(+), 19 deletions(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index 81272c846f..4566d258a7 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -582,7 +582,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo } config.Root = realRoot // Create the root directory if it doesn't exists - if err := system.MkdirAll(config.Root, 0700); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(config.Root, 0700); err != nil { return nil, err } @@ -634,7 +634,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo daemonRepo := filepath.Join(config.Root, "containers") - if err := system.MkdirAll(daemonRepo, 0700); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(daemonRepo, 0700); err != nil { return nil, err } @@ -661,7 +661,7 @@ func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemo trustDir := filepath.Join(config.Root, "trust") - if err := system.MkdirAll(trustDir, 0700); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(trustDir, 0700); err != nil { return nil, err } trustService, err := trust.NewTrustStore(trustDir) diff --git a/daemon/graphdriver/aufs/aufs.go b/daemon/graphdriver/aufs/aufs.go index ff243cd961..edb8809120 100644 --- a/daemon/graphdriver/aufs/aufs.go +++ b/daemon/graphdriver/aufs/aufs.go @@ -104,13 +104,8 @@ func Init(root string, options []string) (graphdriver.Driver, error) { active: make(map[string]int), } - // Create the root aufs driver dir and return - // if it already exists - // If not populate the dir structure + // Create the root aufs driver dir if err := os.MkdirAll(root, 0755); err != nil { - if os.IsExist(err) { - return a, nil - } return nil, err } @@ -118,6 +113,7 @@ func Init(root string, options []string) (graphdriver.Driver, error) { return nil, err } + // Populate the dir structure for _, p := range paths { if err := os.MkdirAll(path.Join(root, p), 0755); err != nil { return nil, err diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 51e8d57db3..6dddeb1849 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -238,7 +238,7 @@ func (devices *DeviceSet) ensureImage(name string, size int64) (string, error) { dirname := devices.loopbackDir() filename := path.Join(dirname, name) - if err := os.MkdirAll(dirname, 0700); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(dirname, 0700); err != nil { return "", err } @@ -1260,7 +1260,7 @@ func (devices *DeviceSet) initDevmapper(doInit bool) error { logrus.Warn("Udev sync is not supported. This will lead to unexpected behavior, data loss and errors. For more information, see https://docs.docker.com/reference/commandline/cli/#daemon-storage-driver-option") } - if err := os.MkdirAll(devices.metadataDir(), 0700); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(devices.metadataDir(), 0700); err != nil { return err } diff --git a/daemon/graphdriver/devmapper/driver.go b/daemon/graphdriver/devmapper/driver.go index 9ee673032f..b744bef788 100644 --- a/daemon/graphdriver/devmapper/driver.go +++ b/daemon/graphdriver/devmapper/driver.go @@ -159,7 +159,7 @@ func (d *Driver) Get(id, mountLabel string) (string, error) { mp := path.Join(d.home, "mnt", id) // Create the target directories if they don't exist - if err := os.MkdirAll(mp, 0755); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(mp, 0755); err != nil { return "", err } @@ -169,7 +169,7 @@ func (d *Driver) Get(id, mountLabel string) (string, error) { } rootFs := path.Join(mp, "rootfs") - if err := os.MkdirAll(rootFs, 0755); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(rootFs, 0755); err != nil { d.DeviceSet.UnmountDevice(id) return "", err } diff --git a/daemon/graphdriver/overlay/overlay.go b/daemon/graphdriver/overlay/overlay.go index 1265a0dc97..018266633d 100644 --- a/daemon/graphdriver/overlay/overlay.go +++ b/daemon/graphdriver/overlay/overlay.go @@ -124,7 +124,7 @@ func Init(home string, options []string) (graphdriver.Driver, error) { } // Create the driver home dir - if err := os.MkdirAll(home, 0755); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(home, 0755); err != nil { return nil, err } diff --git a/daemon/graphdriver/zfs/zfs.go b/daemon/graphdriver/zfs/zfs.go index 605e14b7cd..cf029963d9 100644 --- a/daemon/graphdriver/zfs/zfs.go +++ b/daemon/graphdriver/zfs/zfs.go @@ -280,7 +280,7 @@ func (d *Driver) Get(id, mountLabel string) (string, error) { logrus.Debugf(`[zfs] mount("%s", "%s", "%s")`, filesystem, mountpoint, options) // Create the target directories if they don't exist - if err := os.MkdirAll(mountpoint, 0755); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(mountpoint, 0755); err != nil { return "", err } diff --git a/graph/graph.go b/graph/graph.go index 4a6079c87f..a0f071846d 100644 --- a/graph/graph.go +++ b/graph/graph.go @@ -107,7 +107,7 @@ func NewGraph(root string, driver graphdriver.Driver) (*Graph, error) { return nil, err } // Create the root directory if it doesn't exists - if err := system.MkdirAll(root, 0700); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(root, 0700); err != nil { return nil, err } diff --git a/integration-cli/docker_utils.go b/integration-cli/docker_utils.go index eb79cc11ce..f2c7e4c48e 100644 --- a/integration-cli/docker_utils.go +++ b/integration-cli/docker_utils.go @@ -1187,7 +1187,7 @@ func newFakeGit(name string, files map[string]string, enforceLocalServer bool) ( // Call c.Fatal() at the first error. func writeFile(dst, content string, c *check.C) { // Create subdirectories if necessary - if err := os.MkdirAll(path.Dir(dst), 0700); err != nil && !os.IsExist(err) { + if err := os.MkdirAll(path.Dir(dst), 0700); err != nil { c.Fatal(err) } f, err := os.OpenFile(dst, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0700) diff --git a/pkg/archive/archive.go b/pkg/archive/archive.go index 11a707d20e..362e07cf5d 100644 --- a/pkg/archive/archive.go +++ b/pkg/archive/archive.go @@ -714,7 +714,7 @@ func (archiver *Archiver) CopyWithTar(src, dst string) error { } // Create dst, copy src's content into it logrus.Debugf("Creating dest directory: %s", dst) - if err := system.MkdirAll(dst, 0755); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(dst, 0755); err != nil { return err } logrus.Debugf("Calling TarUntar(%s, %s)", src, dst) @@ -746,7 +746,7 @@ func (archiver *Archiver) CopyFileWithTar(src, dst string) (err error) { dst = filepath.Join(dst, filepath.Base(src)) } // Create the holding directory if necessary - if err := system.MkdirAll(filepath.Dir(dst), 0700); err != nil && !os.IsExist(err) { + if err := system.MkdirAll(filepath.Dir(dst), 0700); err != nil { return err }