Description
What version of Go are you using (go version
)?
$ go version go version go1.13.3 linux/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env
)?
Windows 10, amd64 (go env not available on that machine)
What did you do?
EDIT: updated reproducer
package main
import ( "io/ioutil"; "time" )
func main() {
aFile := "z35219.txt"
for {
err := ioutil.WriteFile(aFile, []byte("abcdefghijklmnopqrstuvwxyz"), 0600)
if err != nil { panic(err) }
aTmr := time.NewTimer(10*time.Second)
for aRead := true; aRead; {
select {
case <-aTmr.C:
aRead = false
default:
_, err := ioutil.ReadFile(aFile)
if err != nil { panic(err) }
}
}
}
}
What did you expect to see?
No error; this is the case on Win7.
What did you see instead?
On Win10:
panic: open z35219.txt: The process cannot access the file because
it is being used by another process.
goroutine 1 [running]: main.main() /.../z35219.go:17 +0x10a
Discussion
I see this intermittently in a real app.
EDIT: the following is related to the initial reproducer
I wondered whether GetFileAttributesEx() changed in Windows 10 (or 8) to disallow concurrent read access. But the above program still fails (maybe less often?) on Win10 if I patch stat() to only call CreateFile(), like so:
const READ_CONTROL, FILE_READ_ATTRIBUTES uint32 = 0x20000, 0x80 // from WinAPI docs
h, err = CreateFile(namep, READ_CONTROL|FILE_READ_ATTRIBUTES, FILE_SHARE_READ, nil,
OPEN_EXISTING, createFileAttrs, 0)
Those arguments are suggested here: https://stackoverflow.com/questions/52813820/createfile-fails-because-of-sharin-violation-because-some-other-os-process-is-us
Stat(): https://golang.org/src/os/stat_windows.go#L76
Open(): https://golang.org/src/syscall/syscall_windows.go#L266
@jstarks any ideas?
cc @alexbrainman @zx2c4 @bcmills
@gopherbot add release-blocker OS-Windows