Skip to content
This repository has been archived by the owner on Mar 9, 2019. It is now read-only.

Smartos cannot compile bolt due to use of flock. #274

Closed
fire opened this issue Dec 29, 2014 · 5 comments · Fixed by #411
Closed

Smartos cannot compile bolt due to use of flock. #274

fire opened this issue Dec 29, 2014 · 5 comments · Fixed by #411

Comments

@fire
Copy link

fire commented Dec 29, 2014

Smartos doesn't have Flock and jperkin talks about the alternatives. The last reference shows how someone changed etcd to avoid flock.

This is preventing me from running influxdb so I'm making an issue tracking it.

References

https://github.com/jperkin/www.perkin.org.uk/blob/master/_posts/2013-01-08-solaris-portability-flock.markdown

https://github.com/Sphonic/etcd/commit/aed35b89585f5b1c96096cd013c3e4c72731417f

@benbjohnson
Copy link
Member

@fire It looks like Go provides a FcntlFlock() call that we can change Bolt to use.

@fire
Copy link
Author

fire commented Jan 1, 2015

I'm available to attempt to use bolt as part of influxdb. I can run tests of bolt on smartos

@benbjohnson
Copy link
Member

@fire That'd be great. I also need to figure out a way to test locally. Maybe I can get a Vagrant box running with SmartOS.

@MerlinDMC
Copy link

@benbjohnson you can use FcntlFlock() on OS X and Linux as well - you just can't use Flock() on Illumos

Also I'm afraid to say that the FcntlFlock() implementation does work different from Flock() regarding locks done in the same pid: https://gist.github.com/MerlinDMC/3197f4d13f8145c457e4

I'm currently still thinking that I'm using it wrong.

@akolb1
Copy link

akolb1 commented Apr 23, 2015

Here is a suggested fix for etc:

--- /dev/null
+++ b/pkg/fileutil/lock_solaris.go
@@ -0,0 +1,95 @@
+// Copyright 2015 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// +build solaris
+
+package fileutil
+
+import (
+       "errors"
+       "os"
+       "syscall"
+)
+
+var (
+       ErrLocked = errors.New("file already locked")
+)
+
+type Lock interface {
+       Name() string
+       TryLock() error
+       Lock() error
+       Unlock() error
+       Destroy() error
+}
+
+type lock struct {
+       fd   int
+       file *os.File
+}
+
+func (l *lock) Name() string {
+       return l.file.Name()
+}
+
+// TryLock acquires exclusivity on the lock without blocking
+func (l *lock) TryLock() error {
+       var lock syscall.Flock_t
+       lock.Start = 0
+       lock.Len = 0
+       lock.Type = syscall.F_WRLCK
+       lock.Whence = 0
+       err := syscall.FcntlFlock(uintptr(l.fd), syscall.F_SETLK, &lock)
+       if err != nil && err == syscall.EAGAIN {
+               return ErrLocked
+       }
+       return err
+}
+
+// Lock acquires exclusivity on the lock without blocking
+func (l *lock) Lock() error {
+       var lock syscall.Flock_t
+       lock.Start = 0
+       lock.Len = 0
+       lock.Type = syscall.F_WRLCK
+       lock.Whence = 0
+       return syscall.FcntlFlock(uintptr(l.fd), syscall.F_SETLK, &lock)
+}
+
+// Unlock unlocks the lock
+func (l *lock) Unlock() error {
+       var lock syscall.Flock_t
+       lock.Start = 0
+       lock.Len = 0
+       lock.Type = syscall.F_UNLCK
+       lock.Whence = 0
+       err := syscall.FcntlFlock(uintptr(l.fd), syscall.F_SETLK, &lock)
+       if err != nil && err == syscall.EAGAIN {
+               return ErrLocked
+       }
+       return err
+}
+
+func (l *lock) Destroy() error {
+       return l.file.Close()
+}
+
+       return l.file.Close()
+}
+
+func NewLock(file string) (Lock, error) {
+       f, err := os.Open(file)
+       if err != nil {
+               return nil, err
+       }
+       l := &lock{int(f.Fd()), f}
+       return l, nil
+}
diff --git a/pkg/fileutil/lock_unix.go b/pkg/fileutil/lock_unix.go
index ce7bc9d..f6e69cc 100644
--- a/pkg/fileutil/lock_unix.go
+++ b/pkg/fileutil/lock_unix.go
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
-// +build !windows,!plan9
+// +build !windows,!plan9,!solaris
 package fileutil

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants