in go/services/leasedlock/lease.go [105:147]
func (l *Lease[K, V]) Acquire(
ctx context.Context,
duration time.Duration,
opt ...Option,
) (bool, error) {
var opts Options
opts.Apply(opt)
if err := l.mu.Lock(ctx); err != nil {
return false, err
}
defer l.mu.Unlock()
// Error on duplicate renews so we don't start up conflicting goroutines.
if opts.Renew > 0 && l.done != nil {
return false, ErrRenewing
}
ok, err := l.try(ctx, duration, &opts)
if !ok || err != nil {
return ok, err
}
// If specified, renew until an attempt fails or the lease is released.
if opts.Renew > 0 {
var ctx context.Context
ctx, l.done = context.WithCancel(context.Background())
go func() {
for {
select {
case <-time.After(opts.Renew):
ok, _ := l.try(ctx, duration, &opts)
if !ok {
return
}
case <-ctx.Done():
}
}
}()
}
return true, nil
}