]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/lockedfile, os: fix O_CREATE flag on Plan 9
authorFazlul Shahriar <fshahriar@gmail.com>
Sat, 9 Nov 2019 21:02:46 +0000 (16:02 -0500)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 9 Nov 2019 22:14:01 +0000 (22:14 +0000)
os.OpenFile was assuming that a failed syscall.Open means the file does
not exist and it tries to create it. However, syscall.Open may have
failed for some other reason, such as failing to lock a os.ModeExclusive
file. We change os.OpenFile to only create the file if the error
indicates that the file doesn't exist.

Remove skip of TestTransform test, which was failing because sometimes
syscall.Open would fail due to the file being locked, but the
syscall.Create would succeed because the file is no longer locked. The
create was truncating the file.

Fixes #35471

Change-Id: I06583b5f8ac33dc90a51cc4fb64f2d8d9c0c2113
Reviewed-on: https://go-review.googlesource.com/c/go/+/206299
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/go/internal/lockedfile/transform_test.go
src/os/file_plan9.go

index 189833a630c8ed37c93af22440cd21e3cb8b9304..407d48ea4a35f5cad06b31b70b8b9c8e1aaae681 100644 (file)
@@ -10,10 +10,8 @@ package lockedfile_test
 import (
        "bytes"
        "encoding/binary"
-       "internal/testenv"
        "math/rand"
        "path/filepath"
-       "runtime"
        "testing"
        "time"
 
@@ -37,10 +35,6 @@ func roundDownToPowerOf2(x int) int {
 }
 
 func TestTransform(t *testing.T) {
-       if runtime.GOOS == "plan9" {
-               testenv.SkipFlaky(t, 35471)
-       }
-
        dir, remove := mustTempDir(t)
        defer remove()
        path := filepath.Join(dir, "blob.bin")
index e0a3826a34cb7b4f4a330b3a0f1230e250c7d1a4..48bf5f5076a67e0fc95c756c97d2a33714385a5c 100644 (file)
@@ -111,7 +111,7 @@ func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
                fd, e = syscall.Create(name, flag, syscallMode(perm))
        } else {
                fd, e = syscall.Open(name, flag)
-               if e != nil && create {
+               if IsNotExist(e) && create {
                        var e1 error
                        fd, e1 = syscall.Create(name, flag, syscallMode(perm))
                        if e1 == nil {