diff --git a/cmd/helm/repo_add.go b/cmd/helm/repo_add.go index b93222f4a..ef9ddf223 100644 --- a/cmd/helm/repo_add.go +++ b/cmd/helm/repo_add.go @@ -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 } diff --git a/glide.lock b/glide.lock index 4f031a502..f05bd18f1 100644 --- a/glide.lock +++ b/glide.lock @@ -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: diff --git a/glide.yaml b/glide.yaml index c9ac54b98..fd6613b71 100644 --- a/glide.yaml +++ b/glide.yaml @@ -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