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 <hchen@redhat.com>
This commit is contained in:
Huamin Chen 2015-09-14 14:37:27 -04:00
parent adf59896e0
commit 45d4f7d6c2
2 changed files with 32 additions and 1 deletions

View File

@ -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)
}

View File

@ -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
}