func cas(t *testing.T) { fmt.Println("cas") kv := kvdb.Instance() assert.NotNil(t, kv, "Default KVDB is not set") key := "foo/docker" val := "great" defer func() { kv.Delete(key) }() kvPair, err := kv.Put(key, []byte(val), 10) assert.NoError(t, err, "Unxpected error in Put") kvPair, err = kv.Get(key) assert.NoError(t, err, "Failed in Get") _, err = kv.CompareAndSet(kvPair, kvdb.KVFlags(0), []byte("badval")) assert.Error(t, err, "CompareAndSet should fail on an incorrect previous value") kvPair.ModifiedIndex++ _, err = kv.CompareAndSet(kvPair, kvdb.KVModifiedIndex, nil) assert.Error(t, err, "CompareAndSet should fail on an incorrect modified index") kvPair.ModifiedIndex-- kvPair, err = kv.CompareAndSet(kvPair, kvdb.KVModifiedIndex, nil) assert.NoError(t, err, "CompareAndSet should succeed on an correct modified index") kvPair, err = kv.CompareAndSet(kvPair, kvdb.KVFlags(0), []byte(val)) assert.NoError(t, err, "CompareAndSet should succeed on an correct value") kvPair, err = kv.CompareAndSet(kvPair, kvdb.KVModifiedIndex, []byte(val)) assert.NoError(t, err, "CompareAndSet should succeed on an correct value and modified index") }
func cas(kv kvdb.Kvdb, t *testing.T) { fmt.Println("\ncas") key := "foo/docker" val := "great" defer func() { kv.Delete(key) }() kvPair, err := kv.Put(key, []byte(val), 0) assert.NoError(t, err, "Unxpected error in Put") kvPair, err = kv.Get(key) assert.NoError(t, err, "Failed in Get") _, err = kv.CompareAndSet(kvPair, kvdb.KVFlags(0), []byte("badval")) assert.Error(t, err, "CompareAndSet should fail on an incorrect previous value") //assert.EqualError(t, err, kvdb.ErrValueMismatch.Error(), "CompareAndSet should return value mismatch error") copyKVPair := *kvPair copyKVPair.ModifiedIndex++ _, err = kv.CompareAndSet(©KVPair, kvdb.KVModifiedIndex, nil) assert.Error(t, err, "CompareAndSet should fail on an incorrect modified index") //kvPair.ModifiedIndex-- copyKVPair.ModifiedIndex-- kvPair, err = kv.CompareAndSet(©KVPair, kvdb.KVModifiedIndex, nil) assert.NoError(t, err, "CompareAndSet should succeed on an correct modified index") kvPairNew, err := kv.CompareAndSet(kvPair, kvdb.KVFlags(0), []byte(val)) if err != nil { // consul does not handle this kind of compare and set assert.EqualError(t, err, kvdb.ErrNotSupported.Error(), "Invalid error returned : %v", err) } else { assert.NoError(t, err, "CompareAndSet should succeed on an correct value") } if kvPairNew != nil { kvPair = kvPairNew } kvPair, err = kv.CompareAndSet(kvPair, kvdb.KVModifiedIndex, []byte(val)) assert.NoError(t, err, "CompareAndSet should succeed on an correct value and modified index") }
func (kv *MemKV) CompareAndDelete(kvp *kvdb.KVPair, flags kvdb.KVFlags) (*kvdb.KVPair, error) { if flags != kvdb.KVFlags(0) { return nil, kvdb.ErrNotSupported } if result, err := kv.Get(kvp.Key); err != nil { return nil, err } else if !bytes.Equal(result.Value, kvp.Value) { return nil, kvdb.ErrNotFound } return kv.Delete(kvp.Key) }
func (kv *etcdKV) Unlock(kvp *kvdb.KVPair) error { l, ok := kvp.Lock.(*etcdLock) if !ok { return fmt.Errorf("Invalid lock structure for key %v", string(kvp.Key)) } l.Lock() // Don't modify kvp here, CompareAndDelete does that. _, err := kv.CompareAndDelete(kvp, kvdb.KVFlags(0)) if err == nil { l.unlocked = true l.Unlock() l.done <- struct{}{} return nil } l.Unlock() return err }
func getNextIdFromKVDB() (int64, error) { kv := kvdb.Instance() nextAlertsId := 0 kvp, err := kv.Create(getNextAlertsIdKey(), strconv.FormatInt(int64(nextAlertsId+1), 10), 0) for err != nil { kvp, err = kv.GetVal(getNextAlertsIdKey(), &nextAlertsId) if err != nil { err = ErrNotInitialized return int64(nextAlertsId), err } prevValue := kvp.Value kvp.Value = []byte(strconv.FormatInt(int64(nextAlertsId+1), 10)) kvp, err = kv.CompareAndSet(kvp, kvdb.KVFlags(0), prevValue) } return int64(nextAlertsId), err }
func (kv *MemKV) Unlock(kvp *kvdb.KVPair) error { _, err := kv.CompareAndDelete(kvp, kvdb.KVFlags(0)) return err }
func (kv *EtcdKV) Unlock(kvp *kvdb.KVPair) error { // Don't modify kvp here, CompareAndDelete does that. _, err := kv.CompareAndDelete(kvp, kvdb.KVFlags(0)) return err }