src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

robustio.go (1989B)


      1 // Copyright 2019 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // Package robustio wraps I/O functions that are prone to failure on Windows,
      6 // transparently retrying errors up to an arbitrary timeout.
      7 //
      8 // Errors are classified heuristically and retries are bounded, so the functions
      9 // in this package do not completely eliminate spurious errors. However, they do
     10 // significantly reduce the rate of failure in practice.
     11 //
     12 // If so, the error will likely wrap one of:
     13 // The functions in this package do not completely eliminate spurious errors,
     14 // but substantially reduce their rate of occurrence in practice.
     15 package robustio
     16 
     17 // Rename is like os.Rename, but on Windows retries errors that may occur if the
     18 // file is concurrently read or overwritten.
     19 //
     20 // (See golang.org/issue/31247 and golang.org/issue/32188.)
     21 func Rename(oldpath, newpath string) error {
     22 	return rename(oldpath, newpath)
     23 }
     24 
     25 // ReadFile is like os.ReadFile, but on Windows retries errors that may
     26 // occur if the file is concurrently replaced.
     27 //
     28 // (See golang.org/issue/31247 and golang.org/issue/32188.)
     29 func ReadFile(filename string) ([]byte, error) {
     30 	return readFile(filename)
     31 }
     32 
     33 // RemoveAll is like os.RemoveAll, but on Windows retries errors that may occur
     34 // if an executable file in the directory has recently been executed.
     35 //
     36 // (See golang.org/issue/19491.)
     37 func RemoveAll(path string) error {
     38 	return removeAll(path)
     39 }
     40 
     41 // IsEphemeralError reports whether err is one of the errors that the functions
     42 // in this package attempt to mitigate.
     43 //
     44 // Errors considered ephemeral include:
     45 //   - syscall.ERROR_ACCESS_DENIED
     46 //   - syscall.ERROR_FILE_NOT_FOUND
     47 //   - internal/syscall/windows.ERROR_SHARING_VIOLATION
     48 //
     49 // This set may be expanded in the future; programs must not rely on the
     50 // non-ephemerality of any given error.
     51 func IsEphemeralError(err error) bool {
     52 	return isEphemeralError(err)
     53 }