Skip to content

Commit

Permalink
Merge pull request kubernetes#106988 from andyzhangx/automated-cherry…
Browse files Browse the repository at this point in the history
…-pick-of-#106906-upstream-release-1.23

Automated cherry pick of kubernetes#106906: mount-utils: Detect potential stale file handle
  • Loading branch information
k8s-ci-robot committed Jan 6, 2022
2 parents 23eeeef + ea103cb commit 9c32425
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 14 deletions.
14 changes: 0 additions & 14 deletions staging/src/k8s.io/mount-utils/mount_helper_common.go
Expand Up @@ -135,17 +135,3 @@ func removePathIfNotMountPoint(mountPath string, mounter Interface, extensiveMou
}
return notMnt, nil
}

// PathExists returns true if the specified path exists.
// TODO: clean this up to use pkg/util/file/FileExists
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
} else if os.IsNotExist(err) {
return false, nil
} else if IsCorruptedMnt(err) {
return true, err
}
return false, err
}
28 changes: 28 additions & 0 deletions staging/src/k8s.io/mount-utils/mount_helper_unix.go
Expand Up @@ -20,12 +20,15 @@ limitations under the License.
package mount

import (
"errors"
"fmt"
"io/fs"
"os"
"strconv"
"strings"
"syscall"

"k8s.io/klog/v2"
utilio "k8s.io/utils/io"
)

Expand All @@ -51,6 +54,8 @@ func IsCorruptedMnt(err error) bool {
underlyingError = pe.Err
case *os.SyscallError:
underlyingError = pe.Err
case syscall.Errno:
underlyingError = err
}

return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO || underlyingError == syscall.EACCES || underlyingError == syscall.EHOSTDOWN
Expand Down Expand Up @@ -157,3 +162,26 @@ func isMountPointMatch(mp MountPoint, dir string) bool {
deletedDir := fmt.Sprintf("%s\\040(deleted)", dir)
return ((mp.Path == dir) || (mp.Path == deletedDir))
}

// PathExists returns true if the specified path exists.
// TODO: clean this up to use pkg/util/file/FileExists
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
} else if errors.Is(err, fs.ErrNotExist) {
err = syscall.Access(path, syscall.F_OK)
if err == nil {
// The access syscall says the file exists, the stat syscall says it
// doesn't. This was observed on CIFS when the path was removed at
// the server somehow. POSIX calls this a stale file handle, let's fake
// that error and treat the path as existing but corrupted.
klog.Warningf("Potential stale file handle detected: %s", path)
return true, syscall.ESTALE
}
return false, nil
} else if IsCorruptedMnt(err) {
return true, err
}
return false, err
}
14 changes: 14 additions & 0 deletions staging/src/k8s.io/mount-utils/mount_helper_windows.go
Expand Up @@ -95,3 +95,17 @@ func ValidateDiskNumber(disk string) error {
func isMountPointMatch(mp MountPoint, dir string) bool {
return mp.Path == dir
}

// PathExists returns true if the specified path exists.
// TODO: clean this up to use pkg/util/file/FileExists
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
} else if os.IsNotExist(err) {
return false, nil
} else if IsCorruptedMnt(err) {
return true, err
}
return false, err
}

0 comments on commit 9c32425

Please sign in to comment.