From 29bd6e738d87cb6bc6fdf87b48f00fd51b20ea78 Mon Sep 17 00:00:00 2001 From: Huamin Chen Date: Fri, 18 Sep 2015 10:50:30 -0400 Subject: [PATCH] review feedback Signed-off-by: Huamin Chen --- pkg/kubelet/volumes.go | 13 ++++++++++--- pkg/util/util.go | 14 +++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/pkg/kubelet/volumes.go b/pkg/kubelet/volumes.go index 1db402ba725..e7662fe9848 100644 --- a/pkg/kubelet/volumes.go +++ b/pkg/kubelet/volumes.go @@ -145,12 +145,19 @@ func (kl *Kubelet) getPodVolumes(podUID types.UID) ([]*volumeTuple, error) { for _, volumeKindDir := range volumeKindDirs { volumeKind := volumeKindDir.Name() volumeKindPath := path.Join(podVolDir, volumeKind) - volumeNameDirs, err := util.ReadDirNoExit(volumeKindPath) + // ioutil.ReadDir exits without returning any healthy dir when encountering the first lstat error + // but skipping dirs means no cleanup for healthy volumes. switching to a no-exit api solves this problem + volumeNameDirs, volumeNameDirsStat, err := util.ReadDirNoExit(volumeKindPath) if err != nil { return []*volumeTuple{}, fmt.Errorf("could not read directory %s: %v", volumeKindPath, err) } - for _, volumeNameDir := range volumeNameDirs { - volumes = append(volumes, &volumeTuple{Kind: volumeKind, Name: volumeNameDir.Name()}) + for i, volumeNameDir := range volumeNameDirs { + if volumeNameDir != nil { + volumes = append(volumes, &volumeTuple{Kind: volumeKind, Name: volumeNameDir.Name()}) + } else { + lerr := volumeNameDirsStat[i] + glog.Errorf("Could not read directory %s: %v", podVolDir, lerr) + } } } return volumes, nil diff --git a/pkg/util/util.go b/pkg/util/util.go index e98db0fc2ad..7954ffe2466 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -523,19 +523,20 @@ func FileExists(filename string) (bool, error) { // borrowed from ioutil.ReadDir // ReadDir reads the directory named by dirname and returns // a list of directory entries, minus those with lstat errors -func ReadDirNoExit(dirname string) ([]os.FileInfo, error) { +func ReadDirNoExit(dirname string) ([]os.FileInfo, []error, error) { if dirname == "" { dirname = "." } f, err := os.Open(dirname) if err != nil { - return nil, err + return nil, nil, err } defer f.Close() names, err := f.Readdirnames(-1) list := make([]os.FileInfo, 0, len(names)) + errs := make([]error, 0, len(names)) for _, filename := range names { fip, lerr := os.Lstat(dirname + "/" + filename) if os.IsNotExist(lerr) { @@ -543,11 +544,10 @@ func ReadDirNoExit(dirname string) ([]os.FileInfo, error) { // Just treat it as if it didn't exist. continue } - // if lstat fails, fip is nil - if fip != nil { - list = append(list, fip) - } + + list = append(list, fip) + errs = append(errs, lerr) } - return list, nil + return list, errs, nil }