Browse Source

etcdserver: use prev-lease for 'ignore_lease' writes

sharat 9 years ago
parent
commit
8a87769a09
1 changed files with 10 additions and 2 deletions
  1. 10 2
      etcdserver/apply.go

+ 10 - 2
etcdserver/apply.go

@@ -161,7 +161,7 @@ func (a *applierV3backend) Put(txnID int64, p *pb.PutRequest) (*pb.PutResponse,
 	)
 	)
 
 
 	var rr *mvcc.RangeResult
 	var rr *mvcc.RangeResult
-	if p.PrevKv || p.IgnoreValue {
+	if p.PrevKv || p.IgnoreValue || p.IgnoreLease {
 		if txnID != noTxn {
 		if txnID != noTxn {
 			rr, err = a.s.KV().TxnRange(txnID, p.Key, nil, mvcc.RangeOptions{})
 			rr, err = a.s.KV().TxnRange(txnID, p.Key, nil, mvcc.RangeOptions{})
 			if err != nil {
 			if err != nil {
@@ -183,6 +183,14 @@ func (a *applierV3backend) Put(txnID int64, p *pb.PutRequest) (*pb.PutResponse,
 		p.Value = rr.KVs[0].Value
 		p.Value = rr.KVs[0].Value
 	}
 	}
 
 
+	if p.IgnoreLease {
+		if rr == nil || len(rr.KVs) == 0 {
+			// ignore_lease flag expects previous key-value pair
+			return nil, ErrKeyNotFound
+		}
+		p.Lease = rr.KVs[0].Lease
+	}
+
 	if txnID != noTxn {
 	if txnID != noTxn {
 		rev, err = a.s.KV().TxnPut(txnID, p.Key, p.Value, lease.LeaseID(p.Lease))
 		rev, err = a.s.KV().TxnPut(txnID, p.Key, p.Value, lease.LeaseID(p.Lease))
 		if err != nil {
 		if err != nil {
@@ -767,7 +775,7 @@ func (a *applierV3backend) checkRequestPut(reqs []*pb.RequestOp) error {
 		if preq == nil {
 		if preq == nil {
 			continue
 			continue
 		}
 		}
-		if preq.IgnoreValue {
+		if preq.IgnoreValue || preq.IgnoreLease {
 			// expects previous key-value, error if not exist
 			// expects previous key-value, error if not exist
 			rr, err := a.s.KV().Range(preq.Key, nil, mvcc.RangeOptions{})
 			rr, err := a.s.KV().Range(preq.Key, nil, mvcc.RangeOptions{})
 			if err != nil {
 			if err != nil {