kubelet: storage: don't hang kubelet on unresponsive nfs

This commit is contained in:
Seth Jennings 2016-10-17 16:44:43 -05:00
parent 714f816a34
commit da3683e2b7
3 changed files with 18 additions and 43 deletions

View File

@ -252,18 +252,11 @@ func (kl *Kubelet) getPodVolumeNameListFromDisk(podUID types.UID) ([]string, err
for _, volumePluginDir := range volumePluginDirs { for _, volumePluginDir := range volumePluginDirs {
volumePluginName := volumePluginDir.Name() volumePluginName := volumePluginDir.Name()
volumePluginPath := path.Join(podVolDir, volumePluginName) volumePluginPath := path.Join(podVolDir, volumePluginName)
volumeDirs, volumeDirsStatErrs, err := util.ReadDirNoExit(volumePluginPath) volumeDirs, err := util.ReadDirNoStat(volumePluginPath)
if err != nil { if err != nil {
return volumes, fmt.Errorf("Could not read directory %s: %v", volumePluginPath, err) return volumes, err
}
for i, volumeDir := range volumeDirs {
if volumeDir != nil {
volumes = append(volumes, volumeDir.Name())
continue
}
glog.Errorf("Could not read directory %s: %v", podVolDir, volumeDirsStatErrs[i])
} }
volumes = append(volumes, volumeDirs...)
} }
return volumes, nil return volumes, nil
} }

View File

@ -32,6 +32,7 @@ import (
"k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/config"
"k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff" "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff"
"k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/mount"
"k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/util/strings"
@ -531,24 +532,21 @@ func getVolumesFromPodDir(podDir string) ([]podVolume, error) {
pluginName := volumeDir.Name() pluginName := volumeDir.Name()
volumePluginPath := path.Join(volumesDir, pluginName) volumePluginPath := path.Join(volumesDir, pluginName)
volumePluginDirs, err := ioutil.ReadDir(volumePluginPath) volumePluginDirs, err := util.ReadDirNoStat(volumePluginPath)
if err != nil { if err != nil {
glog.Errorf("Could not read volume plugin directory %q: %v", volumePluginPath, err) glog.Errorf("Could not read volume plugin directory %q: %v", volumePluginPath, err)
continue continue
} }
unescapePluginName := strings.UnescapeQualifiedNameForDisk(pluginName) unescapePluginName := strings.UnescapeQualifiedNameForDisk(pluginName)
for _, volumeNameDir := range volumePluginDirs { for _, volumeName := range volumePluginDirs {
if volumeNameDir != nil { mountPath := path.Join(volumePluginPath, volumeName)
volumeName := volumeNameDir.Name() volumes = append(volumes, podVolume{
mountPath := path.Join(volumePluginPath, volumeName) podName: volumetypes.UniquePodName(podName),
volumes = append(volumes, podVolume{ volumeSpecName: volumeName,
podName: volumetypes.UniquePodName(podName), mountPath: mountPath,
volumeSpecName: volumeName, pluginName: unescapePluginName,
mountPath: mountPath, })
pluginName: unescapePluginName,
})
}
} }
} }

View File

@ -84,36 +84,20 @@ func FileExists(filename string) (bool, error) {
return true, nil return true, nil
} }
// borrowed from ioutil.ReadDir // ReadDirNoStat returns a string of files/directories contained
// ReadDir reads the directory named by dirname and returns // in dirname without calling lstat on them.
// a list of directory entries, minus those with lstat errors func ReadDirNoStat(dirname string) ([]string, error) {
func ReadDirNoExit(dirname string) ([]os.FileInfo, []error, error) {
if dirname == "" { if dirname == "" {
dirname = "." dirname = "."
} }
f, err := os.Open(dirname) f, err := os.Open(dirname)
if err != nil { if err != nil {
return nil, nil, err return nil, err
} }
defer f.Close() defer f.Close()
names, err := f.Readdirnames(-1) return 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) {
// File disappeared between readdir + stat.
// Just treat it as if it didn't exist.
continue
}
list = append(list, fip)
errs = append(errs, lerr)
}
return list, errs, nil
} }
// IntPtr returns a pointer to an int // IntPtr returns a pointer to an int