public async Task AddLeaseRequestAsync_WhenAddingLeaseRequestWithConflict_ShouldReturnFalse() { // Arrange var instanceId = Guid.NewGuid(); var leaseRequest = new LeaseRequest { LeaseType = "test", Priority = 1, InstanceId = instanceId, TimeToLive = 30 }; _mockDocumentClient.Setup(m => m.CreateDocumentAsync( It.Is <Uri>(u => u == UriFactory.CreateDocumentCollectionUri(_options.Database, _options.RequestsCollection)), It.Is <CosmosDbLeaseRequest>(req => req.TimeToLive == leaseRequest.TimeToLive && req.Priority == leaseRequest.Priority && req.InstanceId == leaseRequest.InstanceId && req.LeaseType == leaseRequest.LeaseType), It.IsAny <RequestOptions>(), It.IsAny <bool>(), It.IsAny <CancellationToken>())) .ThrowsAsync(CreateDocumentClientExceptionForTesting(new Error(), HttpStatusCode.Conflict)) .Verifiable(); // Act var result = await _store.AddLeaseRequestAsync(leaseRequest); // Assert result.Should().BeFalse(); _mockDocumentClient.Verify(); _mockTelemetry.Verify(tel => tel.Publish(It.IsAny <ExceptionEvent>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()), Times.Once); }
private AcquireLeaseResult Acquire(string category, LeaseRequest leaseRequest) { DateTime now = DateTime.UtcNow; Lease lease = this.leases.GetValueOrAddNew(Tuple.Create(category, leaseRequest.ResourceKey)); if (lease.ExpiredUtc < now) { lease.ExpiredUtc = now + leaseRequest.Duration; return(new AcquireLeaseResult(new AcquiredLease(leaseRequest.ResourceKey, leaseRequest.Duration, lease.Token, now), ResponseCode.OK, null)); } return(new AcquireLeaseResult(new AcquiredLease(leaseRequest.ResourceKey), ResponseCode.LeaseNotAvailable, new OrleansException("Lease not available"))); }
public async Task Provider_TryRenewLeaseWithWrongToken_Return_InvalidToken() { var leaseRequests = new List <LeaseRequest>() { new LeaseRequest(Guid.NewGuid().ToString(), TimeSpan.FromSeconds(15)), new LeaseRequest(Guid.NewGuid().ToString(), TimeSpan.FromSeconds(15)) }; //acquire var results = await this.leaseProvider.Acquire(LeaseCategory, leaseRequests.ToArray()); var acquiredLeaseWithWrongToken = results.Select(result => new AcquiredLease(result.AcquiredLease.ResourceKey, result.AcquiredLease.Duration, Guid.NewGuid().ToString(), result.AcquiredLease.StartTimeUtc)); //renew with wrong token var renewResults = await this.leaseProvider.Renew(LeaseCategory, acquiredLeaseWithWrongToken.ToArray()); for (int i = 0; i < renewResults.Count(); i++) { LeaseRequest request = leaseRequests[i]; AcquireLeaseResult result = renewResults[i]; Assert.Equal(ResponseCode.InvalidToken, result.StatusCode); Assert.Equal(request.ResourceKey, result.AcquiredLease.ResourceKey); } }
/// <inheritdoc /> public async Task <bool> AddLeaseRequestAsync(LeaseRequest leaseRequest) { var cosmosDbLeaseRequest = new CosmosDbLeaseRequest { InstanceId = leaseRequest.InstanceId, Priority = leaseRequest.Priority, LeaseType = leaseRequest.LeaseType, TimeToLive = leaseRequest.TimeToLive }; return(await _retryPolicy.ExecuteAsync(async() => { try { var response = await _documentClient.CreateDocumentAsync( UriFactory.CreateDocumentCollectionUri(_options.Value.Database, _options.Value.RequestsCollection), cosmosDbLeaseRequest, new RequestOptions { ConsistencyLevel = _options.Value.ConsistencyLevel, }).ConfigureAwait(false); if (response.StatusCode == HttpStatusCode.Created) { return true; } } catch (DocumentClientException ex) when(ex.StatusCode == HttpStatusCode.Conflict) { // document was created before, we did not get the lease // do not throw exception _telemetry.Publish(ex.ToExceptionEvent()); } return false; }).ConfigureAwait(false)); }