From b1da829844837b71c37546dda24ce7150b0e771f Mon Sep 17 00:00:00 2001 From: tangcong Date: Sun, 29 Mar 2020 08:09:46 +0800 Subject: [PATCH] lease: fix memory leak in LeaseGrant when node is follower --- lease/lessor.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lease/lessor.go b/lease/lessor.go index cc20283167e..4a244a97810 100644 --- a/lease/lessor.go +++ b/lease/lessor.go @@ -291,14 +291,14 @@ func (le *lessor) Grant(id LeaseID, ttl int64) (*Lease, error) { } le.leaseMap[id] = l - item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} - le.leaseExpiredNotifier.RegisterOrUpdate(item) l.persistTo(le.b) leaseTotalTTLs.Observe(float64(l.ttl)) leaseGranted.Inc() if le.isPrimary() { + item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} + le.leaseExpiredNotifier.RegisterOrUpdate(item) le.scheduleCheckpointIfNeeded(l) } @@ -505,6 +505,7 @@ func (le *lessor) Demote() { } le.clearScheduledLeasesCheckpoints() + le.clearLeaseExpiredNotifier() if le.demotec != nil { close(le.demotec) @@ -648,6 +649,10 @@ func (le *lessor) clearScheduledLeasesCheckpoints() { le.leaseCheckpointHeap = make(LeaseQueue, 0) } +func (le *lessor) clearLeaseExpiredNotifier() { + le.leaseExpiredNotifier = newLeaseExpiredNotifier() +} + // expireExists returns true if expiry items exist. // It pops only when expiry item exists. // "next" is true, to indicate that it may exist in next attempt.