From b6a08a97e23737613b61998f690af7d979e9747b Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Wed, 3 Feb 2016 14:49:33 -0800 Subject: [PATCH] clientv3: don't retry txns that may modify the store --- clientv3/kv.go | 2 +- clientv3/op.go | 4 ++++ clientv3/txn.go | 8 ++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index 2c6a3ff84..d71e7da8a 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -185,7 +185,7 @@ func (kv *kv) do(op Op) (*pb.ResponseUnion, error) { } // do not retry on modifications - if op.t != tRange { + if op.isWrite() { go kv.switchRemote(err) return nil, err } diff --git a/clientv3/op.go b/clientv3/op.go index fdc333469..07c80c0d6 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -64,6 +64,10 @@ func (op Op) toRequestUnion() *pb.RequestUnion { } } +func (op Op) isWrite() bool { + return op.t != tRange +} + func OpRange(key, end string, limit, rev int64, sort *SortOption) Op { return Op{ t: tRange, diff --git a/clientv3/txn.go b/clientv3/txn.go index 84f224834..0e0804457 100644 --- a/clientv3/txn.go +++ b/clientv3/txn.go @@ -58,6 +58,8 @@ type txn struct { cthen bool celse bool + isWrite bool + cmps []*pb.Compare sus []*pb.RequestUnion @@ -101,6 +103,7 @@ func (txn *txn) Then(ops ...Op) Txn { txn.cthen = true for _, op := range ops { + txn.isWrite = txn.isWrite || op.isWrite() txn.sus = append(txn.sus, op.toRequestUnion()) } @@ -118,6 +121,7 @@ func (txn *txn) Else(ops ...Op) Txn { txn.celse = true for _, op := range ops { + txn.isWrite = txn.isWrite || op.isWrite() txn.fas = append(txn.fas, op.toRequestUnion()) } @@ -137,6 +141,10 @@ func (txn *txn) Commit() (*TxnResponse, error) { return (*TxnResponse)(resp), nil } + if txn.isWrite { + return nil, err + } + if isRPCError(err) { return nil, err }