leaes: remove unnecessary O(log N) operation when nothing is expiry

Since heap is already sorted, we can just check first element
to see if anything is expiry, rather than popping and pushing
it back. If nothing is expiry, pop operation is unnecessary.

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
release-3.4
Gyuho Lee 2018-04-02 16:31:58 -07:00
parent a6984c53de
commit 9c62d7b2d1
2 changed files with 8 additions and 4 deletions

View File

@ -52,4 +52,8 @@ func TestLeaseQueue(t *testing.T) {
if more {
t.Fatal("expect no more expiry lease")
}
if le.leaseHeap.Len() != 49 {
t.Fatalf("expected lease heap pop, got %d", le.leaseHeap.Len())
}
}

View File

@ -522,30 +522,30 @@ func (le *lessor) runLoop() {
}
// expireExists returns true if expiry items exist.
// It pops "first" expired item from heap.
// If it's not expired yet, add it back.
// It pops only when expiry item exists.
// "next" is true, to indicate that it may exist in next attempt.
func (le *lessor) expireExists() (l *Lease, ok bool, next bool) {
if le.leaseHeap.Len() == 0 {
return nil, false, false
}
item := heap.Pop(&le.leaseHeap).(*LeaseWithTime) // O(log N)
item := le.leaseHeap[0]
l = le.leaseMap[item.id]
if l == nil {
// lease has expired or been revoked
// no need to revoke (nothing is expiry)
heap.Pop(&le.leaseHeap) // O(log N)
return nil, false, true
}
if time.Now().UnixNano() < item.expiration {
// Candidate expirations are caught up, reinsert this item
// and no need to revoke (nothing is expiry)
heap.Push(&le.leaseHeap, item) // O(log N)
return l, false, false
}
// if the lease is actually expired, add to the removal list. If it is not expired, we can ignore it because another entry will have been inserted into the heap
heap.Pop(&le.leaseHeap) // O(log N)
return l, true, false
}