Skip to content

Commit 853cb72

Browse files
committed
open the lock file for writing
1 parent 2394740 commit 853cb72

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

extensions/internal/flock/flock.go

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package flock
1919
import (
2020
"context"
2121
"os"
22-
"runtime"
2322
"sync"
2423
"time"
2524
)
@@ -120,24 +119,11 @@ func tryCtx(ctx context.Context, fn func() (bool, error), retryDelay time.Durati
120119
}
121120

122121
func (f *Flock) setFh() error {
123-
// open a new os.File instance
124-
// create it if it doesn't exist, and open the file read-only.
125-
flags := os.O_CREATE
126-
if runtime.GOOS == "aix" {
127-
// AIX cannot preform write-lock (ie exclusive) on a
128-
// read-only file.
129-
flags |= os.O_RDWR
130-
} else {
131-
flags |= os.O_RDONLY
122+
fh, err := os.OpenFile(f.path, os.O_CREATE|os.O_RDWR, os.FileMode(0600))
123+
if err == nil {
124+
f.fh = fh
132125
}
133-
fh, err := os.OpenFile(f.path, flags, os.FileMode(0600))
134-
if err != nil {
135-
return err
136-
}
137-
138-
// set the filehandle on the struct
139-
f.fh = fh
140-
return nil
126+
return err
141127
}
142128

143129
// ensure the file handle is closed if no lock is held

extensions/internal/lock/lock.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ func (l *Lock) Lock(ctx context.Context) error {
6666
return err
6767
}
6868
} else if locked {
69-
_, _ = l.f.Fh().WriteString(fmt.Sprintf("{%d} {%s}", os.Getpid(), os.Args[0]))
69+
if fh := l.f.Fh(); fh != nil {
70+
s := fmt.Sprintf("{%d} {%s}", os.Getpid(), os.Args[0])
71+
_, _ = fh.WriteString(s)
72+
}
7073
return nil
7174
}
7275
}

extensions/internal/lock/lock_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
package lock
55

66
import (
7+
"bytes"
78
"context"
89
"errors"
10+
"io"
911
"os"
1012
"path/filepath"
1113
"runtime"
@@ -49,11 +51,40 @@ func TestCreatesAndRemovesFile(t *testing.T) {
4951
require.NoError(t, err)
5052
require.FileExists(t, p, "Lock didn't create the file")
5153

54+
buf := bytes.NewBuffer(nil)
55+
_, err = io.Copy(buf, lock.f.Fh())
56+
require.NoError(t, err)
57+
require.NotEmpty(t, buf, "Lock didn't write debug info to the locked file")
58+
5259
err = lock.Unlock()
5360
require.NoError(t, err)
5461
require.NoFileExists(t, p, "Unlock didn't remove the file")
5562
}
5663

64+
func TestFileExists(t *testing.T) {
65+
p := filepath.Join(t.TempDir(), t.Name())
66+
f, err := os.Create(p)
67+
require.NoError(t, err)
68+
data := "stuff"
69+
_, err = f.WriteString(data)
70+
require.NoError(t, err)
71+
require.NoError(t, f.Close())
72+
73+
// Lock should succeed when the file exists but isn't locked
74+
lock, err := New(p, 0)
75+
require.NoError(t, err)
76+
err = lock.Lock(ctx)
77+
require.NoError(t, err)
78+
79+
buf := bytes.NewBuffer(nil)
80+
_, err = io.Copy(buf, lock.f.Fh())
81+
require.NoError(t, err)
82+
require.NotEqual(t, data, buf, "Lock didn't write debug info to the locked file")
83+
84+
require.NoError(t, lock.Unlock())
85+
require.NoFileExists(t, p, "Unlock didn't remove the file")
86+
}
87+
5788
func TestLockError(t *testing.T) {
5889
p := filepath.Join(t.TempDir(), t.Name())
5990
lock, err := New(p, 0)

0 commit comments

Comments
 (0)