Commit 6fe478f9 authored by renovate's avatar renovate
Browse files

Update module github.com/theckman/go-flock to v0.8.1

parent cac8fcaa
Pipeline #17698 passed with stages
in 1 minute and 49 seconds
......@@ -16,7 +16,7 @@ require (
github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627
github.com/pquerna/otp v1.3.0
github.com/prometheus/client_golang v1.10.0
github.com/theckman/go-flock v0.8.0
github.com/theckman/go-flock v0.8.1
github.com/tstranex/u2f v1.0.0
go.opencensus.io v0.23.0
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
......
......@@ -34,6 +34,13 @@ const (
writeLock lockType = unix.F_WRLCK
)
type cmdType int
const (
tryLock cmdType = unix.F_SETLK
waitLock cmdType = unix.F_SETLKW
)
type inode = uint64
type inodeLock struct {
......@@ -90,7 +97,7 @@ func (f *Flock) lock(locked *bool, flag lockType) error {
defer f.ensureFhState()
}
if _, err := f.doLock(flag, true); err != nil {
if _, err := f.doLock(waitLock, flag, true); err != nil {
return err
}
......@@ -98,7 +105,7 @@ func (f *Flock) lock(locked *bool, flag lockType) error {
return nil
}
func (f *Flock) doLock(lt lockType, blocking bool) (bool, error) {
func (f *Flock) doLock(cmd cmdType, lt lockType, blocking bool) (bool, error) {
// POSIX locks apply per inode and process, and the lock for an inode is
// released when *any* descriptor for that inode is closed. So we need to
// synchronize access to each inode internally, and must serialize lock and
......@@ -143,10 +150,13 @@ func (f *Flock) doLock(lt lockType, blocking bool) (bool, error) {
wait <- f
}
err = setlkw(f.fh.Fd(), lt)
err = setlkw(f.fh.Fd(), cmd, lt)
if err != nil {
f.doUnlock()
if cmd == tryLock && err == unix.EACCES {
return false, nil
}
return false, err
}
......@@ -186,7 +196,7 @@ func (f *Flock) doUnlock() (err error) {
mu.Unlock()
if owner == f {
err = setlkw(f.fh.Fd(), unix.F_UNLCK)
err = setlkw(f.fh.Fd(), waitLock, unix.F_UNLCK)
}
mu.Lock()
......@@ -246,7 +256,7 @@ func (f *Flock) try(locked *bool, flag lockType) (bool, error) {
defer f.ensureFhState()
}
haslock, err := f.doLock(flag, false)
haslock, err := f.doLock(tryLock, flag, false)
if err != nil {
return false, err
}
......@@ -255,10 +265,10 @@ func (f *Flock) try(locked *bool, flag lockType) (bool, error) {
return haslock, nil
}
// setlkw calls FcntlFlock with F_SETLKW for the entire file indicated by fd.
func setlkw(fd uintptr, lt lockType) error {
// setlkw calls FcntlFlock with cmd for the entire file indicated by fd.
func setlkw(fd uintptr, cmd cmdType, lt lockType) error {
for {
err := unix.FcntlFlock(fd, unix.F_SETLKW, &unix.Flock_t{
err := unix.FcntlFlock(fd, int(cmd), &unix.Flock_t{
Type: int16(lt),
Whence: io.SeekStart,
Start: 0,
......
......@@ -102,7 +102,7 @@ github.com/prometheus/common/model
github.com/prometheus/procfs
github.com/prometheus/procfs/internal/fs
github.com/prometheus/procfs/internal/util
# github.com/theckman/go-flock v0.8.0
# github.com/theckman/go-flock v0.8.1
## explicit
github.com/theckman/go-flock
# github.com/tstranex/u2f v1.0.0
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment