From bb644e7982b7a669f67eb680c14ddd290f7bc237 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 25 Feb 2020 14:54:18 -0500 Subject: [PATCH] cmd/go/internal/modfetch: retry rename for unzipped directories No test because this is difficult to reproduce, and such a test would always be flaky. Updates #36568 Change-Id: I8170410a7729ecc6f90baf8005444d6b1241185e Reviewed-on: https://go-review.googlesource.com/c/go/+/220978 Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob --- src/cmd/go/internal/modfetch/fetch.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index 54fbd92b43..e2c463a685 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -22,6 +22,7 @@ import ( "cmd/go/internal/lockedfile" "cmd/go/internal/par" "cmd/go/internal/renameio" + "cmd/go/internal/robustio" "golang.org/x/mod/module" "golang.org/x/mod/sumdb/dirhash" @@ -101,6 +102,9 @@ func download(mod module.Version, dir string) (err error) { // signal that it has been extracted successfully, and if someone deletes // the entire directory (e.g. as an attempt to prune out file corruption) // the module cache will still be left in a recoverable state. + // We retry failed renames using robustio.Rename on Windows. Programs that + // open files in the temporary directory (antivirus, search indexers, etc.) + // can cause os.Rename to fail with ERROR_ACCESS_DENIED. if err := os.MkdirAll(parentDir, 0777); err != nil { return err } @@ -119,7 +123,7 @@ func download(mod module.Version, dir string) (err error) { return err } - if err := os.Rename(tmpDir, dir); err != nil { + if err := robustio.Rename(tmpDir, dir); err != nil { return err } -- 2.50.0