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  }