From 690a0b6f009ee48769ce2b56c6ba7bad9c5b9433 Mon Sep 17 00:00:00 2001 From: fanmin shi Date: Fri, 16 Sep 2016 16:57:55 -0700 Subject: [PATCH] etcdserver: parallelize expired leases process When 1000 leases expired at the same time, etcd takes more than 5 seconds to clean them. This means that even after the leases have expired, keys associated with leases are still accessible. I increase the deletion throughput by parallelizing leases deletion process. --- etcdserver/server.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/etcdserver/server.go b/etcdserver/server.go index 903e55163..3bc8d81d6 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -81,6 +81,9 @@ const ( maxInFlightMsgSnap = 16 releaseDelayAfterSnapshot = 30 * time.Second + + // maxPendingRevokes is the maximum number of outstanding expired lease revocations. + maxPendingRevokes = 16 ) var ( @@ -619,8 +622,19 @@ func (s *EtcdServer) run() { sched.Schedule(f) case leases := <-expiredLeaseC: s.goAttach(func() { - for _, l := range leases { - s.LeaseRevoke(context.TODO(), &pb.LeaseRevokeRequest{ID: int64(l.ID)}) + // Increases throughput of expired leases deletion process through parallelization + c := make(chan struct{}, maxPendingRevokes) + for _, lease := range leases { + select { + case c <- struct{}{}: + case <-s.stopping: + return + } + lid := lease.ID + s.goAttach(func() { + s.LeaseRevoke(context.TODO(), &pb.LeaseRevokeRequest{ID: int64(lid)}) + <-c + }) } }) case err := <-s.errorc: