diff --git a/lease/lessor.go b/lease/lessor.go index 5120d1cfcdd3..da29186d008b 100644 --- a/lease/lessor.go +++ b/lease/lessor.go @@ -15,6 +15,7 @@ package lease import ( + "context" "encoding/binary" "errors" "math" @@ -26,11 +27,17 @@ import ( "github.com/coreos/etcd/lease/leasepb" "github.com/coreos/etcd/mvcc/backend" "github.com/coreos/etcd/pkg/monotime" + + "golang.org/x/time/rate" ) const ( // NoLease is a special LeaseID representing the absence of a lease. NoLease = LeaseID(0) + + // maximum number of leases to revoke per second + // TODO: make this configurable? + leaseRevokesPerSecond = 1000 ) var ( @@ -412,7 +419,8 @@ func (le *lessor) Stop() { func (le *lessor) runLoop() { defer close(le.doneC) - for { + revokerLimiter := rate.NewLimiter(rate.Limit(leaseRevokesPerSecond), leaseRevokesPerSecond) + for revokerLimiter.Wait(context.Background()) == nil { var ls []*Lease le.mu.Lock()