From 98f8dfbc9d662ac0441fbbdaf2f2c757c2259e22 Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Tue, 14 Apr 2015 22:18:04 -0700 Subject: [PATCH] etcdserver: prevExist=true + condition is compareAndSwap PrevExist indicates the key should exist. Condition compares with an existing key. So PrevExist+condition = CompareAndSwap not Update. --- etcdserver/server.go | 6 +++++- etcdserver/server_test.go | 8 +++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/etcdserver/server.go b/etcdserver/server.go index b2f3979dd..7a9d0dc4f 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -702,7 +702,11 @@ func (s *EtcdServer) applyRequest(r pb.Request) Response { switch { case existsSet: if exists { - return f(s.store.Update(r.Path, r.Val, expr)) + if r.PrevIndex == 0 && r.PrevValue == "" { + return f(s.store.Update(r.Path, r.Val, expr)) + } else { + return f(s.store.CompareAndSwap(r.Path, r.PrevValue, r.PrevIndex, r.Val, expr)) + } } return f(s.store.Create(r.Path, r.Dir, r.Val, false, expr)) case r.PrevIndex > 0 || r.PrevValue != "": diff --git a/etcdserver/server_test.go b/etcdserver/server_test.go index 2059590ef..9ba9b6739 100644 --- a/etcdserver/server_test.go +++ b/etcdserver/server_test.go @@ -235,20 +235,18 @@ func TestApplyRequest(t *testing.T) { }, }, }, - // PUT with PrevExist=true *and* PrevIndex set ==> Update - // TODO(jonboulle): is this expected?! + // PUT with PrevExist=true *and* PrevIndex set ==> CompareAndSwap { pb.Request{Method: "PUT", ID: 1, PrevExist: pbutil.Boolp(true), PrevIndex: 1}, Response{Event: &store.Event{}}, []testutil.Action{ { - Name: "Update", - Params: []interface{}{"", "", time.Time{}}, + Name: "CompareAndSwap", + Params: []interface{}{"", "", uint64(1), "", time.Time{}}, }, }, }, // PUT with PrevExist=false *and* PrevIndex set ==> Create - // TODO(jonboulle): is this expected?! { pb.Request{Method: "PUT", ID: 1, PrevExist: pbutil.Boolp(false), PrevIndex: 1}, Response{Event: &store.Event{}},