diff --git a/lease/lessor.go b/lease/lessor.go index 3418cf565..815e10c0f 100644 --- a/lease/lessor.go +++ b/lease/lessor.go @@ -99,6 +99,9 @@ type Lessor interface { // Lookup gives the lease at a given lease id, if any Lookup(id LeaseID) *Lease + // Leases lists all leases. + Leases() []*Lease + // ExpiredLeasesC returns a chan that is used to receive expired leases. ExpiredLeasesC() <-chan []*Lease @@ -317,6 +320,22 @@ func (le *lessor) Lookup(id LeaseID) *Lease { return le.leaseMap[id] } +func (le *lessor) unsafeLeases() []*Lease { + leases := make([]*Lease, 0, len(le.leaseMap)) + for _, l := range le.leaseMap { + leases = append(leases, l) + } + sort.Sort(leasesByExpiry(leases)) + return leases +} + +func (le *lessor) Leases() []*Lease { + le.mu.Lock() + ls := le.unsafeLeases() + le.mu.Unlock() + return ls +} + func (le *lessor) Promote(extend time.Duration) { le.mu.Lock() defer le.mu.Unlock() @@ -334,11 +353,7 @@ func (le *lessor) Promote(extend time.Duration) { } // adjust expiries in case of overlap - leases := make([]*Lease, 0, len(le.leaseMap)) - for _, l := range le.leaseMap { - leases = append(leases, l) - } - sort.Sort(leasesByExpiry(leases)) + leases := le.unsafeLeases() baseWindow := leases[0].Remaining() nextWindow := baseWindow + time.Second @@ -636,6 +651,8 @@ func (fl *FakeLessor) Renew(id LeaseID) (int64, error) { return 10, nil } func (le *FakeLessor) Lookup(id LeaseID) *Lease { return nil } +func (le *FakeLessor) Leases() []*Lease { return nil } + func (fl *FakeLessor) ExpiredLeasesC() <-chan []*Lease { return nil } func (fl *FakeLessor) Recover(b backend.Backend, rd RangeDeleter) {} diff --git a/lease/lessor_test.go b/lease/lessor_test.go index 7ea2972a9..4d040a246 100644 --- a/lease/lessor_test.go +++ b/lease/lessor_test.go @@ -72,6 +72,17 @@ func TestLessorGrant(t *testing.T) { t.Errorf("new lease.id = %x, want != %x", nl.ID, l.ID) } + lss := []*Lease{gl, nl} + leases := le.Leases() + for i := range lss { + if lss[i].ID != leases[i].ID { + t.Fatalf("lease ID expected %d, got %d", lss[i].ID, leases[i].ID) + } + if lss[i].ttl != leases[i].ttl { + t.Fatalf("ttl expected %d, got %d", lss[i].ttl, leases[i].ttl) + } + } + be.BatchTx().Lock() _, vs := be.BatchTx().UnsafeRange(leaseBucketName, int64ToBytes(int64(l.ID)), nil, 0) if len(vs) != 1 {