From 8221beb62745d5e67502251d407d8da22aad7704 Mon Sep 17 00:00:00 2001 From: Kir Kolyshkin Date: Wed, 29 Jul 2015 18:08:29 -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. [1] https://github.com/golang/go/blob/f9ed2f75/src/os/path.go Signed-off-by: Kir Kolyshkin --- endpoint.go | 7 +------ sandbox/namespace_linux.go | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/endpoint.go b/endpoint.go index d38a4fd121..3475e9eafd 100644 --- a/endpoint.go +++ b/endpoint.go @@ -297,12 +297,7 @@ func (ep *endpoint) processOptions(options ...EndpointOption) { } func createBasePath(dir string) error { - err := os.MkdirAll(dir, 0644) - if err != nil && !os.IsExist(err) { - return err - } - - return nil + return os.MkdirAll(dir, 0644) } func createFile(path string) error { diff --git a/sandbox/namespace_linux.go b/sandbox/namespace_linux.go index 3ab011cd1c..214da312d0 100644 --- a/sandbox/namespace_linux.go +++ b/sandbox/namespace_linux.go @@ -48,7 +48,7 @@ func init() { func createBasePath() { err := os.MkdirAll(prefix, 0644) - if err != nil && !os.IsExist(err) { + if err != nil { panic("Could not create net namespace path directory") }