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);
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 4
0
        /// <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));
        }