42f0963bf9
Before this change asynchronous closes in cmount could cause sharing violations under Windows on Remove which manifest themselves frequently as test failures. This change lets the Remove be retried on a sharing violation under Windows.
38 lines
673 B
Go
38 lines
673 B
Go
//+build windows
|
|
|
|
package local
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/ncw/rclone/fs"
|
|
)
|
|
|
|
const (
|
|
ERROR_SHARING_VIOLATION syscall.Errno = 32
|
|
)
|
|
|
|
// Removes name, retrying on a sharing violation
|
|
func remove(name string) (err error) {
|
|
const maxTries = 10
|
|
var sleepTime = 1 * time.Millisecond
|
|
for i := 0; i < maxTries; i++ {
|
|
err = os.Remove(name)
|
|
if err == nil {
|
|
break
|
|
}
|
|
pathErr, ok := err.(*os.PathError)
|
|
if !ok {
|
|
break
|
|
}
|
|
if pathErr.Err != ERROR_SHARING_VIOLATION {
|
|
break
|
|
}
|
|
fs.Logf(name, "Remove detected sharing violation - retry %d/%d sleeping %v", i+1, maxTries, sleepTime)
|
|
time.Sleep(sleepTime)
|
|
sleepTime <<= 1
|
|
}
|
|
return err
|
|
}
|