This repository has been archived by the owner on Mar 9, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Smartos cannot compile bolt due to use of flock. #274
Comments
@fire It looks like Go provides a |
I'm available to attempt to use bolt as part of influxdb. I can run tests of bolt on smartos |
@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. |
@benbjohnson you can use Also I'm afraid to say that the I'm currently still thinking that I'm using it wrong. |
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.
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
The text was updated successfully, but these errors were encountered: