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)));