mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-18 19:44:00 +00:00
builder: retry cached archive renames on Windows (#5462)
This commit is contained in:
+1
-1
@@ -218,7 +218,7 @@ func (l *Library) load(config *compileopts.Config, tmpdir string) (job *compileJ
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Store this archive in the cache.
|
// Store this archive in the cache.
|
||||||
return os.Rename(f.Name(), archiveFilePath)
|
return robustRename(f.Name(), archiveFilePath)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package builder
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
func robustRename(oldpath, newpath string) error {
|
||||||
|
return os.Rename(oldpath, newpath)
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package builder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"math/rand"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const robustRenameTimeout = 2 * time.Second
|
||||||
|
|
||||||
|
func robustRename(oldpath, newpath string) error {
|
||||||
|
var bestErr error
|
||||||
|
start := time.Now()
|
||||||
|
nextSleep := time.Millisecond
|
||||||
|
for {
|
||||||
|
err := os.Rename(oldpath, newpath)
|
||||||
|
if err == nil || !isEphemeralRenameError(err) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if bestErr == nil {
|
||||||
|
bestErr = err
|
||||||
|
}
|
||||||
|
if d := time.Since(start) + nextSleep; d >= robustRenameTimeout {
|
||||||
|
return bestErr
|
||||||
|
}
|
||||||
|
time.Sleep(nextSleep)
|
||||||
|
nextSleep += time.Duration(rand.Int63n(int64(nextSleep)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func isEphemeralRenameError(err error) bool {
|
||||||
|
var errno syscall.Errno
|
||||||
|
if errors.As(err, &errno) {
|
||||||
|
switch errno {
|
||||||
|
case syscall.Errno(2), // ERROR_FILE_NOT_FOUND
|
||||||
|
syscall.Errno(5), // ERROR_ACCESS_DENIED
|
||||||
|
syscall.Errno(32): // ERROR_SHARING_VIOLATION
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user