public Lease GetLease(Instance instance, GetLeaseRequest leaseRequest)
        {
            ValidateLeaseTimeSpan(leaseRequest.LeaseTimeSpan);

            DelayedInstanceWrap delayedWrap;

            if (!leaseProviders.TryGetValue(instance, out delayedWrap))
            {
                RequestInstanceDiscovery();

                throw new InstanceNotRegisteredException(instance.Identity.GetAnyString());
            }
            if (delayedWrap.InstanceLeaseProvider == null)
            {
                throw new Exception($"LeaseProvider for Instance {instance.Identity.GetAnyString()} will be available " +
                                    $"in at most {leaseConfiguration.ClockDrift.TotalMilliseconds} ms.");
            }

            return(delayedWrap.InstanceLeaseProvider.GetLease(new GetLeaseRequest
            {
                LeaseTimeSpan = leaseRequest.LeaseTimeSpan,
                RequestorIdentity = leaseRequest.RequestorIdentity,
                MinValidityTimeFraction = leaseRequest.MinValidityTimeFraction
            }));
        }
        private void ReadOrRenewLease(GetLeaseRequest request)
        {
            var lease = AсquireOrLearnLease(ballotGenerator.New(instance.Identity),
                                            request.RequestorIdentity,
                                            request.LeaseTimeSpan);

            lastKnownLease = lease;
        }
        public Lease GetLease(GetLeaseRequest request)
        {
            if (LeaseNullOrExpired(lastKnownLease) ||
                IsLeaseOwner(request.RequestorIdentity, lastKnownLease) && LeaseShouldBeProlonged(request, lastKnownLease))
            {
                ReadOrRenewLease(request);
            }

            return(lastKnownLease);
        }
 private bool LeaseShouldBeProlonged(GetLeaseRequest request, Lease lastKnownLease)
 => lastKnownLease.ExpiresAt - DateTime.UtcNow
 <=
 Max(minLeaseValidityPeriod, request.LeaseTimeSpan.DivideBy(Math.Max(request.MinValidityTimeFraction, 1)));