github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/lease/lease.go (about) 1 package lease 2 3 import "time" 4 5 // Leaser manages resources via leases 6 type Leaser interface { 7 // lease the resource r for duration d. When the lease expires, invoke `revoke` 8 // a lease can be refreshed by calling Lease() again on the same resource 9 Lease(r string, d time.Duration, revoke func()) 10 // return the resource r. 11 Return(r string) 12 } 13 14 type leaser struct { 15 timers map[string]*time.Timer 16 } 17 18 // NewLeaser creates a new lease leaser 19 func NewLeaser() Leaser { 20 return &leaser{ 21 timers: make(map[string]*time.Timer), 22 } 23 } 24 25 func (l *leaser) Lease(r string, d time.Duration, revoke func()) { 26 timer := time.AfterFunc(d, revoke) 27 // cancel the old timer and add the new one 28 if t, ok := l.timers[r]; ok { 29 t.Stop() 30 } 31 l.timers[r] = timer 32 } 33 34 func (l *leaser) Return(r string) { 35 if t, ok := l.timers[r]; ok { 36 t.Stop() 37 } 38 }