Browse Source

lease: add 'Leases' method

Signed-off-by: Gyu-Ho Lee <gyuhox@gmail.com>
Gyu-Ho Lee 8 years ago
parent
commit
099fbde809
2 changed files with 33 additions and 5 deletions
  1. 22 5
      lease/lessor.go
  2. 11 0
      lease/lessor_test.go

+ 22 - 5
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) {}

+ 11 - 0
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 {