浏览代码

Update libkv

- To commit id  c2aac5dbbaa5c872211edea7c0f32b3bd67e7410

Signed-off-by: Alessandro Boch <aboch@docker.com>
Alessandro Boch 9 年之前
父节点
当前提交
3cc33dc491

+ 1 - 1
libnetwork/Godeps/Godeps.json

@@ -156,7 +156,7 @@
 		},
 		},
 		{
 		{
 			"ImportPath": "github.com/docker/libkv",
 			"ImportPath": "github.com/docker/libkv",
-			"Rev": "749af6c5b3fb755bec1738cc5e0d3a6f1574d730"
+			"Rev": "c2aac5dbbaa5c872211edea7c0f32b3bd67e7410"
 		},
 		},
 		{
 		{
 			"ImportPath": "github.com/godbus/dbus",
 			"ImportPath": "github.com/godbus/dbus",

+ 3 - 0
libnetwork/Godeps/_workspace/src/github.com/docker/libkv/store/boltdb/boltdb.go

@@ -330,6 +330,9 @@ func (b *BoltDB) AtomicDelete(key string, previous *store.KVPair) (bool, error)
 		}
 		}
 
 
 		val = bucket.Get([]byte(key))
 		val = bucket.Get([]byte(key))
+		if val == nil {
+			return store.ErrKeyNotFound
+		}
 		dbIndex := binary.LittleEndian.Uint64(val[:libkvmetadatalen])
 		dbIndex := binary.LittleEndian.Uint64(val[:libkvmetadatalen])
 		if dbIndex != previous.LastIndex {
 		if dbIndex != previous.LastIndex {
 			return store.ErrKeyModified
 			return store.ErrKeyModified

+ 7 - 0
libnetwork/Godeps/_workspace/src/github.com/docker/libkv/store/consul/consul.go

@@ -467,6 +467,13 @@ func (s *Consul) AtomicDelete(key string, previous *store.KVPair) (bool, error)
 	}
 	}
 
 
 	p := &api.KVPair{Key: s.normalize(key), ModifyIndex: previous.LastIndex}
 	p := &api.KVPair{Key: s.normalize(key), ModifyIndex: previous.LastIndex}
+
+	// Extra Get operation to check on the key
+	_, err := s.Get(key)
+	if err != nil && err == store.ErrKeyNotFound {
+		return false, err
+	}
+
 	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 {

+ 4 - 0
libnetwork/Godeps/_workspace/src/github.com/docker/libkv/store/etcd/etcd.go

@@ -368,6 +368,10 @@ func (s *Etcd) AtomicDelete(key string, previous *store.KVPair) (bool, error) {
 	_, err := s.client.Delete(context.Background(), s.normalize(key), delOpts)
 	_, err := s.client.Delete(context.Background(), s.normalize(key), delOpts)
 	if err != nil {
 	if err != nil {
 		if etcdError, ok := err.(etcd.Error); ok {
 		if etcdError, ok := err.(etcd.Error); ok {
+			// Key Not Found
+			if etcdError.Code == etcd.ErrorCodeKeyNotFound {
+				return false, store.ErrKeyNotFound
+			}
 			// Compare failed
 			// Compare failed
 			if etcdError.Code == etcd.ErrorCodeTestFailed {
 			if etcdError.Code == etcd.ErrorCodeTestFailed {
 				return false, store.ErrKeyModified
 				return false, store.ErrKeyModified

+ 6 - 0
libnetwork/Godeps/_workspace/src/github.com/docker/libkv/store/zookeeper/zookeeper.go

@@ -347,9 +347,15 @@ func (s *Zookeeper) AtomicDelete(key string, previous *store.KVPair) (bool, erro
 
 
 	err := s.client.Delete(s.normalize(key), int32(previous.LastIndex))
 	err := s.client.Delete(s.normalize(key), int32(previous.LastIndex))
 	if err != nil {
 	if err != nil {
+		// Key not found
+		if err == zk.ErrNoNode {
+			return false, store.ErrKeyNotFound
+		}
+		// Compare failed
 		if err == zk.ErrBadVersion {
 		if err == zk.ErrBadVersion {
 			return false, store.ErrKeyModified
 			return false, store.ErrKeyModified
 		}
 		}
+		// General store error
 		return false, err
 		return false, err
 	}
 	}
 	return true, nil
 	return true, nil

+ 5 - 0
libnetwork/Godeps/_workspace/src/github.com/docker/libkv/testutils/utils.go

@@ -312,6 +312,11 @@ func testAtomicDelete(t *testing.T, kv store.Store) {
 	success, err = kv.AtomicDelete(key, pair)
 	success, err = kv.AtomicDelete(key, pair)
 	assert.NoError(t, err)
 	assert.NoError(t, err)
 	assert.True(t, success)
 	assert.True(t, success)
+
+	// Delete a non-existent key; should fail
+	success, err = kv.AtomicDelete(key, pair)
+	assert.Error(t, store.ErrKeyNotFound)
+	assert.False(t, success)
 }
 }
 
 
 func testLockUnlock(t *testing.T, kv store.Store) {
 func testLockUnlock(t *testing.T, kv store.Store) {