|
@@ -215,30 +215,30 @@ func (s *store) CompareAndSwap(nodePath string, prevValue string, prevIndex uint
|
|
|
|
|
|
|
|
// If both of the prevValue and prevIndex are given, we will test both of them.
|
|
// If both of the prevValue and prevIndex are given, we will test both of them.
|
|
|
// Command will be executed, only if both of the tests are successful.
|
|
// Command will be executed, only if both of the tests are successful.
|
|
|
- if n.Compare(prevValue, prevIndex) {
|
|
|
|
|
- // update etcd index
|
|
|
|
|
- s.CurrentIndex++
|
|
|
|
|
|
|
+ if !n.Compare(prevValue, prevIndex) {
|
|
|
|
|
+ cause := fmt.Sprintf("[%v != %v] [%v != %v]", prevValue, n.Value, prevIndex, n.ModifiedIndex)
|
|
|
|
|
+ s.Stats.Inc(CompareAndSwapFail)
|
|
|
|
|
+ return nil, etcdErr.NewError(etcdErr.EcodeTestFailed, cause, s.CurrentIndex)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- e := newEvent(CompareAndSwap, nodePath, s.CurrentIndex, n.CreatedIndex)
|
|
|
|
|
- eNode := e.Node
|
|
|
|
|
|
|
+ // update etcd index
|
|
|
|
|
+ s.CurrentIndex++
|
|
|
|
|
|
|
|
- eNode.PrevValue = n.Value
|
|
|
|
|
|
|
+ e := newEvent(CompareAndSwap, nodePath, s.CurrentIndex, n.CreatedIndex)
|
|
|
|
|
+ eNode := e.Node
|
|
|
|
|
|
|
|
- // if test succeed, write the value
|
|
|
|
|
- n.Write(value, s.CurrentIndex)
|
|
|
|
|
- n.UpdateTTL(expireTime)
|
|
|
|
|
|
|
+ eNode.PrevValue = n.Value
|
|
|
|
|
|
|
|
- eNode.Value = value
|
|
|
|
|
- eNode.Expiration, eNode.TTL = n.ExpirationAndTTL()
|
|
|
|
|
|
|
+ // if test succeed, write the value
|
|
|
|
|
+ n.Write(value, s.CurrentIndex)
|
|
|
|
|
+ n.UpdateTTL(expireTime)
|
|
|
|
|
|
|
|
- s.WatcherHub.notify(e)
|
|
|
|
|
- s.Stats.Inc(CompareAndSwapSuccess)
|
|
|
|
|
- return e, nil
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ eNode.Value = value
|
|
|
|
|
+ eNode.Expiration, eNode.TTL = n.ExpirationAndTTL()
|
|
|
|
|
|
|
|
- cause := fmt.Sprintf("[%v != %v] [%v != %v]", prevValue, n.Value, prevIndex, n.ModifiedIndex)
|
|
|
|
|
- s.Stats.Inc(CompareAndSwapFail)
|
|
|
|
|
- return nil, etcdErr.NewError(etcdErr.EcodeTestFailed, cause, s.CurrentIndex)
|
|
|
|
|
|
|
+ s.WatcherHub.notify(e)
|
|
|
|
|
+ s.Stats.Inc(CompareAndSwapSuccess)
|
|
|
|
|
+ return e, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Delete function deletes the node at the given path.
|
|
// Delete function deletes the node at the given path.
|
|
@@ -316,28 +316,28 @@ func (s *store) CompareAndDelete(nodePath string, prevValue string, prevIndex ui
|
|
|
|
|
|
|
|
// If both of the prevValue and prevIndex are given, we will test both of them.
|
|
// If both of the prevValue and prevIndex are given, we will test both of them.
|
|
|
// Command will be executed, only if both of the tests are successful.
|
|
// Command will be executed, only if both of the tests are successful.
|
|
|
- if n.Compare(prevValue, prevIndex) {
|
|
|
|
|
- // update etcd index
|
|
|
|
|
- s.CurrentIndex++
|
|
|
|
|
-
|
|
|
|
|
- e := newEvent(CompareAndDelete, nodePath, s.CurrentIndex, n.CreatedIndex)
|
|
|
|
|
|
|
+ if !n.Compare(prevValue, prevIndex) {
|
|
|
|
|
+ cause := fmt.Sprintf("[%v != %v] [%v != %v]", prevValue, n.Value, prevIndex, n.ModifiedIndex)
|
|
|
|
|
+ s.Stats.Inc(CompareAndDeleteFail)
|
|
|
|
|
+ return nil, etcdErr.NewError(etcdErr.EcodeTestFailed, cause, s.CurrentIndex)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- callback := func(path string) { // notify function
|
|
|
|
|
- // notify the watchers with deleted set true
|
|
|
|
|
- s.WatcherHub.notifyWatchers(e, path, true)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // update etcd index
|
|
|
|
|
+ s.CurrentIndex++
|
|
|
|
|
|
|
|
- // delete a key-value pair, no error should happen
|
|
|
|
|
- n.Remove(false, false, callback)
|
|
|
|
|
|
|
+ e := newEvent(CompareAndDelete, nodePath, s.CurrentIndex, n.CreatedIndex)
|
|
|
|
|
|
|
|
- s.WatcherHub.notify(e)
|
|
|
|
|
- s.Stats.Inc(CompareAndDeleteSuccess)
|
|
|
|
|
- return e, nil
|
|
|
|
|
|
|
+ callback := func(path string) { // notify function
|
|
|
|
|
+ // notify the watchers with deleted set true
|
|
|
|
|
+ s.WatcherHub.notifyWatchers(e, path, true)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- cause := fmt.Sprintf("[%v != %v] [%v != %v]", prevValue, n.Value, prevIndex, n.ModifiedIndex)
|
|
|
|
|
- s.Stats.Inc(CompareAndDeleteFail)
|
|
|
|
|
- return nil, etcdErr.NewError(etcdErr.EcodeTestFailed, cause, s.CurrentIndex)
|
|
|
|
|
|
|
+ // delete a key-value pair, no error should happen
|
|
|
|
|
+ n.Remove(false, false, callback)
|
|
|
|
|
+
|
|
|
|
|
+ s.WatcherHub.notify(e)
|
|
|
|
|
+ s.Stats.Inc(CompareAndDeleteSuccess)
|
|
|
|
|
+ return e, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (s *store) Watch(key string, recursive bool, sinceIndex uint64) (<-chan *Event, error) {
|
|
func (s *store) Watch(key string, recursive bool, sinceIndex uint64) (<-chan *Event, error) {
|