mirror of https://github.com/docker/docs.git
store: Improved locking API and added mocks.
Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
parent
2ff9679938
commit
78839ba4ea
|
@ -302,13 +302,16 @@ func (s *Consul) WatchTree(prefix string, stopCh <-chan struct{}) (<-chan []*KVP
|
||||||
return watchCh, nil
|
return watchCh, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateLock returns a handle to a lock struct which can be used
|
// NewLock returns a handle to a lock struct which can be used to acquire and
|
||||||
// to acquire and release the mutex.
|
// release the mutex.
|
||||||
func (s *Consul) CreateLock(key string, value []byte) (Locker, error) {
|
func (s *Consul) NewLock(key string, options *LockOptions) (Locker, error) {
|
||||||
l, err := s.client.LockOpts(&api.LockOptions{
|
consulOpts := &api.LockOptions{
|
||||||
Key: s.normalize(key),
|
Key: s.normalize(key),
|
||||||
Value: value,
|
}
|
||||||
})
|
if options != nil {
|
||||||
|
consulOpts.Value = options.Value
|
||||||
|
}
|
||||||
|
l, err := s.client.LockOpts(consulOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,8 +277,8 @@ func (s *Etcd) DeleteTree(prefix string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateLock returns a handle to a lock struct which can be used
|
// NewLock returns a handle to a lock struct which can be used to acquire and
|
||||||
// to acquire and release the mutex.
|
// release the mutex.
|
||||||
func (s *Etcd) CreateLock(key string, value []byte) (Locker, error) {
|
func (s *Etcd) NewLock(key string, options *LockOptions) (Locker, error) {
|
||||||
return nil, ErrNotImplemented
|
return nil, ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,9 +56,9 @@ func (s *Mock) WatchTree(prefix string, stopCh <-chan struct{}) (<-chan []*KVPai
|
||||||
return args.Get(0).(chan []*KVPair), args.Error(1)
|
return args.Get(0).(chan []*KVPair), args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateLock mock
|
// NewLock mock
|
||||||
func (s *Mock) CreateLock(key string, value []byte) (Locker, error) {
|
func (s *Mock) NewLock(key string, options *LockOptions) (Locker, error) {
|
||||||
args := s.Mock.Called(key, value)
|
args := s.Mock.Called(key, options)
|
||||||
return args.Get(0).(Locker), args.Error(1)
|
return args.Get(0).(Locker), args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,3 +85,20 @@ func (s *Mock) AtomicDelete(key string, previous *KVPair) (bool, error) {
|
||||||
args := s.Mock.Called(key, previous)
|
args := s.Mock.Called(key, previous)
|
||||||
return args.Bool(0), args.Error(1)
|
return args.Bool(0), args.Error(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MockLock mock implementation of Locker
|
||||||
|
type MockLock struct {
|
||||||
|
mock.Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lock mock
|
||||||
|
func (l *MockLock) Lock() (<-chan struct{}, error) {
|
||||||
|
args := l.Mock.Called()
|
||||||
|
return args.Get(0).(<-chan struct{}), args.Error(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unlock mock
|
||||||
|
func (l *MockLock) Unlock() error {
|
||||||
|
args := l.Mock.Called()
|
||||||
|
return args.Error(0)
|
||||||
|
}
|
||||||
|
|
|
@ -78,7 +78,7 @@ type Store interface {
|
||||||
// CreateLock for a given key.
|
// CreateLock for a given key.
|
||||||
// The returned Locker is not held and must be acquired with `.Lock`.
|
// The returned Locker is not held and must be acquired with `.Lock`.
|
||||||
// value is optional.
|
// value is optional.
|
||||||
CreateLock(key string, value []byte) (Locker, error)
|
NewLock(key string, options *LockOptions) (Locker, error)
|
||||||
|
|
||||||
// List the content of a given prefix
|
// List the content of a given prefix
|
||||||
List(prefix string) ([]*KVPair, error)
|
List(prefix string) ([]*KVPair, error)
|
||||||
|
@ -106,6 +106,11 @@ type WriteOptions struct {
|
||||||
Ephemeral bool
|
Ephemeral bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LockOptions contains optional request parameters
|
||||||
|
type LockOptions struct {
|
||||||
|
Value []byte // Optional, value to associate with the lock
|
||||||
|
}
|
||||||
|
|
||||||
// WatchCallback is used for watch methods on keys
|
// WatchCallback is used for watch methods on keys
|
||||||
// and is triggered on key change
|
// and is triggered on key change
|
||||||
type WatchCallback func(entries ...*KVPair)
|
type WatchCallback func(entries ...*KVPair)
|
||||||
|
@ -130,7 +135,7 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateStore creates a an instance of store
|
// NewStore creates a an instance of store
|
||||||
func NewStore(backend Backend, addrs []string, options *Config) (Store, error) {
|
func NewStore(backend Backend, addrs []string, options *Config) (Store, error) {
|
||||||
if init, exists := initializers[backend]; exists {
|
if init, exists := initializers[backend]; exists {
|
||||||
log.WithFields(log.Fields{"backend": backend}).Debug("Initializing store service")
|
log.WithFields(log.Fields{"backend": backend}).Debug("Initializing store service")
|
||||||
|
|
|
@ -222,10 +222,11 @@ func (s *Zookeeper) AtomicDelete(key string, previous *KVPair) (bool, error) {
|
||||||
return false, ErrNotImplemented
|
return false, ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateLock returns a handle to a lock struct which can be used
|
// NewLock returns a handle to a lock struct which can be used to acquire and
|
||||||
// to acquire and release the mutex.
|
// release the mutex.
|
||||||
func (s *Zookeeper) CreateLock(key string, value []byte) (Locker, error) {
|
func (s *Zookeeper) NewLock(key string, options *LockOptions) (Locker, error) {
|
||||||
// FIXME: `value` is not being used since there is no support in zk.NewLock().
|
// FIXME: `options.Value` is not being used since there is no support in
|
||||||
|
// zk.NewLock().
|
||||||
return &zookeeperLock{
|
return &zookeeperLock{
|
||||||
lock: zk.NewLock(s.client, normalize(key), zk.WorldACL(zk.PermAll)),
|
lock: zk.NewLock(s.client, normalize(key), zk.WorldACL(zk.PermAll)),
|
||||||
}, nil
|
}, nil
|
||||||
|
|
Loading…
Reference in New Issue