]> Cypherpunks repositories - gostls13.git/commitdiff
testing: include ERROR_SHARING_VIOLATION in Windows cleanup retries
authorBryan C. Mills <bcmills@google.com>
Wed, 2 Mar 2022 21:36:27 +0000 (16:36 -0500)
committerBryan Mills <bcmills@google.com>
Thu, 3 Mar 2022 02:39:01 +0000 (02:39 +0000)
Fixes #51442
Updates #50051

Change-Id: I1bfbc08c907077467fd50febbec6299a9b73af41
Reviewed-on: https://go-review.googlesource.com/c/go/+/388916
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/testing/testing.go
src/testing/testing_other.go
src/testing/testing_windows.go

index df4dfe4490439e89c9a15e9f5b241805ec897d6b..05d8f22affdb5a5b8df74963fb6e7e0ef6a46412 100644 (file)
@@ -1122,7 +1122,7 @@ func removeAll(path string) error {
        )
        for {
                err := os.RemoveAll(path)
-               if !isWindowsAccessDenied(err) {
+               if !isWindowsRetryable(err) {
                        return err
                }
                if start.IsZero() {
index 29496d81bc7f1aa03a1542ead1070003b87499bb..99a6276a4a39a99cd7be9acc8c88ef4f09cabb7f 100644 (file)
@@ -6,8 +6,8 @@
 
 package testing
 
-// isWindowsAccessDenied reports whether err is ERROR_ACCESS_DENIED,
-// which is defined only on Windows.
-func isWindowsAccessDenied(err error) bool {
+// isWindowsRetryable reports whether err is a Windows error code
+// that may be fixed by retrying a failed filesystem operation.
+func isWindowsRetryable(err error) bool {
        return false
 }
index bc76cb80ccc0c2f9ccb65edea0b19c42e887ea97..fd48ae9579e05251b369f89bb1811b06f99db0a4 100644 (file)
@@ -8,11 +8,25 @@ package testing
 
 import (
        "errors"
+       "internal/syscall/windows"
        "syscall"
 )
 
-// isWindowsAccessDenied reports whether err is ERROR_ACCESS_DENIED,
-// which is defined only on Windows.
-func isWindowsAccessDenied(err error) bool {
-       return errors.Is(err, syscall.ERROR_ACCESS_DENIED)
+// isWindowsRetryable reports whether err is a Windows error code
+// that may be fixed by retrying a failed filesystem operation.
+func isWindowsRetryable(err error) bool {
+       for {
+               unwrapped := errors.Unwrap(err)
+               if unwrapped == nil {
+                       break
+               }
+               err = unwrapped
+       }
+       if err == syscall.ERROR_ACCESS_DENIED {
+               return true // Observed in https://go.dev/issue/50051.
+       }
+       if err == windows.ERROR_SHARING_VIOLATION {
+               return true // Observed in https://go.dev/issue/51442.
+       }
+       return false
 }