mirror of https://github.com/docker/docs.git
store: Refactor Atomic operations to use KVEntry.
Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
parent
93ad39c079
commit
bd18f27bda
|
|
@ -271,8 +271,8 @@ func (l *consulLock) Unlock() error {
|
||||||
|
|
||||||
// AtomicPut put a value at "key" if the key has not been
|
// AtomicPut put a value at "key" if the key has not been
|
||||||
// modified in the meantime, throws an error if this is the case
|
// modified in the meantime, throws an error if this is the case
|
||||||
func (s *Consul) AtomicPut(key string, _ []byte, newValue []byte, index uint64) (bool, error) {
|
func (s *Consul) AtomicPut(key string, value []byte, previous *KVEntry) (bool, error) {
|
||||||
p := &api.KVPair{Key: s.normalize(key), Value: newValue, ModifyIndex: index}
|
p := &api.KVPair{Key: s.normalize(key), Value: value, ModifyIndex: previous.LastIndex}
|
||||||
if work, _, err := s.client.KV().CAS(p, nil); err != nil {
|
if work, _, err := s.client.KV().CAS(p, nil); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
} else if !work {
|
} else if !work {
|
||||||
|
|
@ -283,8 +283,8 @@ func (s *Consul) AtomicPut(key string, _ []byte, newValue []byte, index uint64)
|
||||||
|
|
||||||
// AtomicDelete deletes a value at "key" if the key has not
|
// AtomicDelete deletes a value at "key" if the key has not
|
||||||
// been modified in the meantime, throws an error if this is the case
|
// been modified in the meantime, throws an error if this is the case
|
||||||
func (s *Consul) AtomicDelete(key string, oldValue []byte, index uint64) (bool, error) {
|
func (s *Consul) AtomicDelete(key string, previous *KVEntry) (bool, error) {
|
||||||
p := &api.KVPair{Key: s.normalize(key), ModifyIndex: index}
|
p := &api.KVPair{Key: s.normalize(key), ModifyIndex: previous.LastIndex}
|
||||||
if work, _, err := s.client.KV().DeleteCAS(p, nil); err != nil {
|
if work, _, err := s.client.KV().DeleteCAS(p, nil); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
} else if !work {
|
} else if !work {
|
||||||
|
|
|
||||||
|
|
@ -176,15 +176,16 @@ func (s *Etcd) CancelWatch(key string) error {
|
||||||
|
|
||||||
// AtomicPut put a value at "key" if the key has not been
|
// AtomicPut put a value at "key" if the key has not been
|
||||||
// modified in the meantime, throws an error if this is the case
|
// modified in the meantime, throws an error if this is the case
|
||||||
func (s *Etcd) AtomicPut(key string, oldValue []byte, newValue []byte, index uint64) (bool, error) {
|
func (s *Etcd) AtomicPut(key string, value []byte, previous *KVEntry) (bool, error) {
|
||||||
resp, err := s.client.CompareAndSwap(normalize(key), string(newValue), 5, string(oldValue), 0)
|
resp, err := s.client.CompareAndSwap(normalize(key), string(value), 5, string(previous.Value), 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
if !(resp.Node.Value == string(newValue) && resp.Node.Key == key && resp.Node.TTL == 5) {
|
// FIXME: Why do we do the check like this? Why is the TTL hardcoded to 5?
|
||||||
|
if !(resp.Node.Value == string(value) && resp.Node.Key == key && resp.Node.TTL == 5) {
|
||||||
return false, ErrKeyModified
|
return false, ErrKeyModified
|
||||||
}
|
}
|
||||||
if !(resp.PrevNode.Value == string(newValue) && resp.PrevNode.Key == key && resp.PrevNode.TTL == 5) {
|
if !(resp.PrevNode.Value == string(previous.Value) && resp.PrevNode.Key == key && resp.PrevNode.TTL == 5) {
|
||||||
return false, ErrKeyModified
|
return false, ErrKeyModified
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
@ -192,12 +193,12 @@ func (s *Etcd) AtomicPut(key string, oldValue []byte, newValue []byte, index uin
|
||||||
|
|
||||||
// AtomicDelete deletes a value at "key" if the key has not
|
// AtomicDelete deletes a value at "key" if the key has not
|
||||||
// been modified in the meantime, throws an error if this is the case
|
// been modified in the meantime, throws an error if this is the case
|
||||||
func (s *Etcd) AtomicDelete(key string, oldValue []byte, index uint64) (bool, error) {
|
func (s *Etcd) AtomicDelete(key string, previous *KVEntry) (bool, error) {
|
||||||
resp, err := s.client.CompareAndDelete(normalize(key), string(oldValue), 0)
|
resp, err := s.client.CompareAndDelete(normalize(key), string(previous.Value), 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
if !(resp.PrevNode.Value == string(oldValue) && resp.PrevNode.Key == key && resp.PrevNode.TTL == 5) {
|
if !(resp.PrevNode.Value == string(previous.Value) && resp.PrevNode.Key == key && resp.PrevNode.TTL == 5) {
|
||||||
return false, ErrKeyModified
|
return false, ErrKeyModified
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
|
|
|
||||||
|
|
@ -66,10 +66,10 @@ type Store interface {
|
||||||
CancelWatchRange(prefix string) error
|
CancelWatchRange(prefix string) error
|
||||||
|
|
||||||
// Atomic operation on a single value
|
// Atomic operation on a single value
|
||||||
AtomicPut(key string, oldValue []byte, newValue []byte, index uint64) (bool, error)
|
AtomicPut(key string, value []byte, previous *KVEntry) (bool, error)
|
||||||
|
|
||||||
// Atomic delete of a single value
|
// Atomic delete of a single value
|
||||||
AtomicDelete(key string, oldValue []byte, index uint64) (bool, error)
|
AtomicDelete(key string, previous *KVEntry) (bool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// KVEntry represents {Key, Value, Lastindex} tuple
|
// KVEntry represents {Key, Value, Lastindex} tuple
|
||||||
|
|
|
||||||
|
|
@ -192,14 +192,14 @@ func (s *Zookeeper) CancelWatchRange(prefix string) error {
|
||||||
|
|
||||||
// AtomicPut put a value at "key" if the key has not been
|
// AtomicPut put a value at "key" if the key has not been
|
||||||
// modified in the meantime, throws an error if this is the case
|
// modified in the meantime, throws an error if this is the case
|
||||||
func (s *Zookeeper) AtomicPut(key string, oldValue []byte, newValue []byte, index uint64) (bool, error) {
|
func (s *Zookeeper) AtomicPut(key string, value []byte, previous *KVEntry) (bool, error) {
|
||||||
// Use index of Set method to implement CAS
|
// Use index of Set method to implement CAS
|
||||||
return false, ErrNotImplemented
|
return false, ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
// AtomicDelete deletes a value at "key" if the key has not
|
// AtomicDelete deletes a value at "key" if the key has not
|
||||||
// been modified in the meantime, throws an error if this is the case
|
// been modified in the meantime, throws an error if this is the case
|
||||||
func (s *Zookeeper) AtomicDelete(key string, oldValue []byte, index uint64) (bool, error) {
|
func (s *Zookeeper) AtomicDelete(key string, previous *KVEntry) (bool, error) {
|
||||||
return false, ErrNotImplemented
|
return false, ErrNotImplemented
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue