From 45d4f7d6c243d011d4c060c89ee7f562d959a566 Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Mon, 14 Sep 2015 14:37:27 -0400 Subject: [PATCH] Opening Pod volume dir could fail if for instance the directory has stale handle or directory is busy. In such case, don't exit if the directory cannot be opened. Signed-off-by: Huamin Chen --- pkg/kubelet/volumes.go | 2 +- pkg/util/util.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/volumes.go b/pkg/kubelet/volumes.go index d9b3c303bc9..1db402ba725 100644 --- a/pkg/kubelet/volumes.go +++ b/pkg/kubelet/volumes.go @@ -145,7 +145,7 @@ func (kl *Kubelet) getPodVolumes(podUID types.UID) ([]*volumeTuple, error) { for _, volumeKindDir := range volumeKindDirs { volumeKind := volumeKindDir.Name() volumeKindPath := path.Join(podVolDir, volumeKind) - volumeNameDirs, err := ioutil.ReadDir(volumeKindPath) + volumeNameDirs, err := util.ReadDirNoExit(volumeKindPath) if err != nil { return []*volumeTuple{}, fmt.Errorf("could not read directory %s: %v", volumeKindPath, err) } diff --git a/pkg/util/util.go b/pkg/util/util.go index 05a4ce31a59..47923eb0581 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -599,3 +599,34 @@ func RemoveAllSkipMountPoints(path string) error { } return err } + +// borrowed from ioutil.ReadDir +// ReadDir reads the directory named by dirname and returns +// a list of directory entries, ignoring lstat returns +func ReadDirNoExit(dirname string) ([]os.FileInfo, error) { + if dirname == "" { + dirname = "." + } + + f, err := os.Open(dirname) + if err != nil { + return nil, err + } + defer f.Close() + + names, err := f.Readdirnames(-1) + list := make([]os.FileInfo, 0, len(names)) + for _, filename := range names { + fip, lerr := os.Lstat(dirname + "/" + filename) + if os.IsNotExist(lerr) { + // File disappeared between readdir + stat. + // Just treat it as if it didn't exist. + continue + } + if fip != nil { + list = append(list, fip) + } + } + + return list, nil +}