func()

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
}