@@ -18,6 +18,7 @@ import (
1818 "fmt"
1919 "time"
2020
21+ pb "go.etcd.io/etcd/api/v3/etcdserverpb"
2122 "go.etcd.io/etcd/client/pkg/v3/types"
2223 "go.etcd.io/etcd/server/v3/etcdserver/api/membership"
2324 "go.etcd.io/etcd/server/v3/etcdserver/api/rafthttp"
@@ -42,6 +43,26 @@ func isConnectedFullySince(transport rafthttp.Transporter, since time.Time, self
4243 return numConnectedSince (transport , since , self , members ) == len (members )
4344}
4445
46+ // isTooManyRequest checks whether the gap between applied index and committed
47+ // index is too large. r *pb.InternalRaftRequest should read-only.
48+ func isTooManyRequest (ai , ci uint64 , r * pb.InternalRaftRequest ) bool {
49+ // Critical request kinds include LeaseRevoke
50+ isCritical := r != nil && r .LeaseRevoke != nil
51+
52+ // If the gap is larger than maxGapBetweenApplyAndCommitIndex, reject all normal request
53+ if ! isCritical && ci > ai + maxGapBetweenApplyAndCommitIndex {
54+ return true
55+ }
56+
57+ // Make an extra 10% gap buffer for critical requests, so thay can be applied
58+ // during overload conditions.
59+ if isCritical && ci - ai > maxGapBetweenApplyAndCommitIndex + 500 {
60+ return true
61+ }
62+
63+ return false
64+ }
65+
4566// numConnectedSince counts how many members are connected to the local member
4667// since the given time.
4768func numConnectedSince (transport rafthttp.Transporter , since time.Time , self types.ID , members []* membership.Member ) int {
0 commit comments