diff --git a/etcdserver/apply.go b/etcdserver/apply.go index b2919b9a8a61..f6fc1feac2f2 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -360,6 +360,11 @@ func (a *applierV3backend) Txn(rt *pb.TxnRequest) (*pb.TxnResponse, error) { resps := make([]*pb.ResponseOp, len(reqs)) changedKV := false for i := range reqs { + if reqs[i] == nil { + // removed by removeNeedlessRangeReqs() + continue + } + if reqs[i].GetRequestRange() == nil { changedKV = true } @@ -732,6 +737,11 @@ func (s *kvSortByValue) Less(i, j int) bool { func (a *applierV3backend) checkRequestLeases(reqs []*pb.RequestOp) error { for _, requ := range reqs { + if requ == nil { + // removed by removeNeedlessRangeReqs() + continue + } + tv, ok := requ.Request.(*pb.RequestOp_RequestPut) if !ok { continue @@ -749,6 +759,11 @@ func (a *applierV3backend) checkRequestLeases(reqs []*pb.RequestOp) error { func (a *applierV3backend) checkRequestRange(reqs []*pb.RequestOp) error { for _, requ := range reqs { + if requ == nil { + // removed by removeNeedlessRangeReqs() + continue + } + tv, ok := requ.Request.(*pb.RequestOp_RequestRange) if !ok { continue @@ -788,3 +803,17 @@ func isGteRange(rangeEnd []byte) bool { func noSideEffect(r *pb.InternalRaftRequest) bool { return r.Range != nil || r.AuthUserGet != nil || r.AuthRoleGet != nil } + +func removeNeedlessRangeReqs(txn *pb.TxnRequest) { + f := func(ops []*pb.RequestOp) { + for i := 0; i < len(ops); i++ { + switch ops[i].Request.(type) { + case *pb.RequestOp_RequestRange: + ops[i] = nil + } + } + } + + f(txn.Success) + f(txn.Failure) +} diff --git a/etcdserver/apply_auth.go b/etcdserver/apply_auth.go index 842657d110ef..a9b8172b009b 100644 --- a/etcdserver/apply_auth.go +++ b/etcdserver/apply_auth.go @@ -94,6 +94,11 @@ func (aa *authApplierV3) DeleteRange(txnID int64, r *pb.DeleteRangeRequest) (*pb func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) error { for _, requ := range reqs { + if requ == nil { + // removed by removeNeedlessRangeReqs() + continue + } + switch tv := requ.Request.(type) { case *pb.RequestOp_RequestRange: if tv.RequestRange == nil { diff --git a/etcdserver/server.go b/etcdserver/server.go index 28336f5934a4..d2713020dda2 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -1080,7 +1080,11 @@ func (s *EtcdServer) applyEntryNormal(e *raftpb.Entry) { } var ar *applyResult - if s.w.IsRegistered(id) || !noSideEffect(&raftReq) { + needResult := s.w.IsRegistered(id) + if needResult || !noSideEffect(&raftReq) { + if !needResult && raftReq.Txn != nil { + removeNeedlessRangeReqs(raftReq.Txn) + } ar = s.applyV3.Apply(&raftReq) }