Use github.com/gofrs/flock for cross platform file locking

Signed-off-by: Patrick Decat <pdecat@gmail.com>
pull/5678/head
Patrick Decat 6 years ago
parent e07dfcbc00
commit 7a470252a9
No known key found for this signature in database
GPG Key ID: FD55B9BD5687D8FF

@ -17,14 +17,17 @@ limitations under the License.
package main
import (
"context"
"fmt"
"io"
"github.com/spf13/cobra"
"syscall"
"time"
"golang.org/x/crypto/ssh/terminal"
"github.com/gofrs/flock"
"github.com/spf13/cobra"
"k8s.io/helm/pkg/getter"
"k8s.io/helm/pkg/helm/helmpath"
"k8s.io/helm/pkg/repo"
@ -133,20 +136,13 @@ func addRepository(name, url, username, password string, home helmpath.Home, cer
}
// Lock the repository file for concurrent processes synchronization and re-read its content before updating it
fd, err := syscall.Open(home.RepositoryFile(), syscall.O_CREAT|syscall.O_RDWR|syscall.O_CLOEXEC, 0)
if err != nil {
return err
fileLock := flock.New(home.RepositoryFile())
lockCtx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
locked, err := fileLock.TryLockContext(lockCtx, time.Second)
if err == nil && locked {
defer fileLock.Unlock()
}
defer syscall.Close(fd)
flock := syscall.Flock_t{
Type: syscall.F_WRLCK,
Start: 0,
Len: 0,
Whence: io.SeekStart,
}
syscall.FcntlFlock(uintptr(fd), syscall.F_SETLK, &flock)
if err != nil {
return err
}

2
glide.lock generated

@ -114,6 +114,8 @@ imports:
- syntax/lexer
- util/runes
- util/strings
- name: github.com/gofrs/flock
version: 392e7fae8f1b0bdbd67dad7237d23f618feb6dbb
- name: github.com/gogo/protobuf
version: 342cbe0a04158f6dcb03ca0079991a51a4248c02
subpackages:

@ -67,6 +67,8 @@ import:
- package: github.com/jmoiron/sqlx
version: ^1.2.0
- package: github.com/rubenv/sql-migrate
- package: github.com/gofrs/flock
version: v0.7.1
testImports:
- package: github.com/stretchr/testify

Loading…
Cancel
Save