public virtual async Task <DocumentServiceResponse> ProcessMessageAsync(DocumentServiceRequest request, CancellationToken cancellationToken = default)
        {
            await GatewayStoreModel.ApplySessionTokenAsync(
                request,
                this.defaultConsistencyLevel,
                this.sessionContainer,
                this.partitionKeyRangeCache,
                this.clientCollectionCache);

            DocumentServiceResponse response;

            try
            {
                Uri physicalAddress = GatewayStoreClient.IsFeedRequest(request.OperationType) ? this.GetFeedUri(request) : this.GetEntityUri(request);
                response = await this.gatewayStoreClient.InvokeAsync(request, request.ResourceType, physicalAddress, cancellationToken);
            }
            catch (DocumentClientException exception)
            {
                if ((!ReplicatedResourceClient.IsMasterResource(request.ResourceType)) &&
                    (exception.StatusCode == HttpStatusCode.PreconditionFailed || exception.StatusCode == HttpStatusCode.Conflict ||
                     (exception.StatusCode == HttpStatusCode.NotFound && exception.GetSubStatus() != SubStatusCodes.ReadSessionNotAvailable)))
                {
                    this.CaptureSessionToken(exception.StatusCode, exception.GetSubStatus(), request, exception.Headers);
                }

                throw;
            }

            this.CaptureSessionToken(response.StatusCode, response.SubStatusCode, request, response.Headers);
            return(response);
        }
Esempio n. 2
0
        public virtual async Task <DocumentServiceResponse> ProcessMessageAsync(DocumentServiceRequest request, CancellationToken cancellationToken = default)
        {
            await GatewayStoreModel.ApplySessionTokenAsync(
                request,
                this.defaultConsistencyLevel,
                this.sessionContainer,
                this.partitionKeyRangeCache,
                this.clientCollectionCache,
                this.endpointManager);

            DocumentServiceResponse response;

            try
            {
                Uri physicalAddress = GatewayStoreClient.IsFeedRequest(request.OperationType) ? this.GetFeedUri(request) : this.GetEntityUri(request);
                // Collect region name only for document resources
                if (request.ResourceType.Equals(ResourceType.Document) && this.endpointManager.TryGetLocationForGatewayDiagnostics(request.RequestContext.LocationEndpointToRoute, out string regionName))
                {
                    request.RequestContext.RegionName = regionName;
                }
                response = await this.gatewayStoreClient.InvokeAsync(request, request.ResourceType, physicalAddress, cancellationToken);
            }
            catch (DocumentClientException exception)
            {
                if ((!ReplicatedResourceClient.IsMasterResource(request.ResourceType)) &&
                    (exception.StatusCode == HttpStatusCode.PreconditionFailed || exception.StatusCode == HttpStatusCode.Conflict ||
                     (exception.StatusCode == HttpStatusCode.NotFound && exception.GetSubStatus() != SubStatusCodes.ReadSessionNotAvailable)))
                {
                    await this.CaptureSessionTokenAndHandleSplitAsync(exception.StatusCode, exception.GetSubStatus(), request, exception.Headers);
                }

                throw;
            }

            await this.CaptureSessionTokenAndHandleSplitAsync(response.StatusCode, response.SubStatusCode, request, response.Headers);

            return(response);
        }
Esempio n. 3
0
        public async Task TestApplySessionForDataOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Document,
                ResourceType.Conflict,
                ResourceType.Batch
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                                       resourceType,
                                       operationType),
                                   $"{resourceType}, {operationType}");
                    {
                        // Verify when user does set session token
                        DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string dsrSessionToken = Guid.NewGuid().ToString();
                        dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, dsrSessionToken);

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsr,
                            ConsistencyLevel.Session,
                            new Mock <ISessionContainer>().Object,
                            partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                            clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                        Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                    }

                    {
                        // Verify when user does not set session token
                        DocumentServiceRequest dsrNoSessionToken = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string dsrSessionToken         = Guid.NewGuid().ToString();
                        Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                        sMock.Setup(x => x.ResolveGlobalSessionToken(dsrNoSessionToken)).Returns(dsrSessionToken);

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsrNoSessionToken,
                            ConsistencyLevel.Session,
                            sMock.Object,
                            partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                            clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                        if (dsrNoSessionToken.IsReadOnlyRequest || dsrNoSessionToken.OperationType == OperationType.Batch)
                        {
                            Assert.AreEqual(dsrSessionToken, dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                        else
                        {
                            Assert.IsNull(dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                    }

                    {
                        // Verify when partition key range is configured
                        DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                            operationType,
                            "Test",
                            resourceType,
                            AuthorizationTokenType.PrimaryMasterKey);

                        string partitionKeyRangeId = "1";
                        dsr.Headers[WFConstants.BackendHeaders.PartitionKeyRangeId] = new PartitionKeyRangeIdentity(partitionKeyRangeId).ToHeader();

                        string dsrSessionToken         = Guid.NewGuid().ToString();
                        Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                        sMock.Setup(x => x.ResolveGlobalSessionToken(dsr)).Returns(dsrSessionToken);

                        ContainerProperties containerProperties = ContainerProperties.CreateWithResourceId("ccZ1ANCszwk=");
                        containerProperties.Id = "TestId";
                        containerProperties.PartitionKeyPath = "/pk";

                        Mock <CollectionCache> mockCollectionCahce = new Mock <CollectionCache>(MockBehavior.Strict);
                        mockCollectionCahce.Setup(x => x.ResolveCollectionAsync(
                                                      dsr,
                                                      It.IsAny <CancellationToken>(),
                                                      NoOpTrace.Singleton)).Returns(Task.FromResult(containerProperties));

                        Mock <PartitionKeyRangeCache> mockPartitionKeyRangeCache = new Mock <PartitionKeyRangeCache>(MockBehavior.Strict, null, null, null);
                        mockPartitionKeyRangeCache.Setup(x => x.TryGetPartitionKeyRangeByIdAsync(
                                                             containerProperties.ResourceId,
                                                             partitionKeyRangeId,
                                                             It.IsAny <ITrace>(),
                                                             false)).Returns(Task.FromResult(new PartitionKeyRange()));

                        await GatewayStoreModel.ApplySessionTokenAsync(
                            dsr,
                            ConsistencyLevel.Session,
                            sMock.Object,
                            partitionKeyRangeCache : mockPartitionKeyRangeCache.Object,
                            clientCollectionCache : mockCollectionCahce.Object);

                        if (dsr.IsReadOnlyRequest || dsr.OperationType == OperationType.Batch)
                        {
                            Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                        else
                        {
                            Assert.IsNull(dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                        }
                    }
                }
            }

            // Verify stored procedure execute
            Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                               ResourceType.StoredProcedure,
                               OperationType.ExecuteJavaScript));

            DocumentServiceRequest dsrSprocExecute = DocumentServiceRequest.CreateFromName(
                OperationType.ExecuteJavaScript,
                "Test",
                ResourceType.StoredProcedure,
                AuthorizationTokenType.PrimaryMasterKey);

            string sessionToken = Guid.NewGuid().ToString();

            dsrSprocExecute.Headers.Add(HttpConstants.HttpHeaders.SessionToken, sessionToken);

            await GatewayStoreModel.ApplySessionTokenAsync(
                dsrSprocExecute,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object,
                partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


            Assert.AreEqual(sessionToken, dsrSprocExecute.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }
Esempio n. 4
0
        public async Task TestApplySessionForMasterOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Database,
                ResourceType.Collection,
                ResourceType.User,
                ResourceType.Permission,
                ResourceType.StoredProcedure,
                ResourceType.Trigger,
                ResourceType.UserDefinedFunction,
                ResourceType.Offer,
                ResourceType.DatabaseAccount,
                ResourceType.PartitionKeyRange,
                ResourceType.UserDefinedType,
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsTrue(GatewayStoreModel.IsMasterOperation(
                                      resourceType,
                                      operationType),
                                  $"{resourceType}, {operationType}");

                    DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, Guid.NewGuid().ToString());

                    await GatewayStoreModel.ApplySessionTokenAsync(
                        dsr,
                        ConsistencyLevel.Session,
                        new Mock <ISessionContainer>().Object,
                        partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                        clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);

                    Assert.IsNull(dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);
                }
            }

            Assert.IsTrue(GatewayStoreModel.IsMasterOperation(
                              ResourceType.Document,
                              OperationType.QueryPlan));

            DocumentServiceRequest dsrQueryPlan = DocumentServiceRequest.CreateFromName(
                OperationType.QueryPlan,
                "Test",
                ResourceType.Document,
                AuthorizationTokenType.PrimaryMasterKey);

            dsrQueryPlan.Headers.Add(HttpConstants.HttpHeaders.SessionToken, Guid.NewGuid().ToString());

            await GatewayStoreModel.ApplySessionTokenAsync(
                dsrQueryPlan,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object,
                partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


            Assert.IsNull(dsrQueryPlan.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }
Esempio n. 5
0
        public async Task TestApplySessionForDataOperation()
        {
            List <ResourceType> resourceTypes = new List <ResourceType>()
            {
                ResourceType.Document,
                ResourceType.Conflict,
                ResourceType.Batch
            };

            List <OperationType> operationTypes = new List <OperationType>()
            {
                OperationType.Create,
                OperationType.Delete,
                OperationType.Read,
                OperationType.Upsert,
                OperationType.Replace
            };

            foreach (ResourceType resourceType in resourceTypes)
            {
                foreach (OperationType operationType in operationTypes)
                {
                    Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                                       resourceType,
                                       operationType),
                                   $"{resourceType}, {operationType}");

                    // Verify when user does set session token
                    DocumentServiceRequest dsr = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    string dsrSessionToken = Guid.NewGuid().ToString();
                    dsr.Headers.Add(HttpConstants.HttpHeaders.SessionToken, dsrSessionToken);

                    await GatewayStoreModel.ApplySessionTokenAsync(
                        dsr,
                        ConsistencyLevel.Session,
                        new Mock <ISessionContainer>().Object,
                        partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                        clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                    Assert.AreEqual(dsrSessionToken, dsr.Headers[HttpConstants.HttpHeaders.SessionToken]);

                    // Verify when user does not set session token
                    DocumentServiceRequest dsrNoSessionToken = DocumentServiceRequest.CreateFromName(
                        operationType,
                        "Test",
                        resourceType,
                        AuthorizationTokenType.PrimaryMasterKey);

                    Mock <ISessionContainer> sMock = new Mock <ISessionContainer>();
                    sMock.Setup(x => x.ResolveGlobalSessionToken(dsrNoSessionToken)).Returns(dsrSessionToken);

                    await GatewayStoreModel.ApplySessionTokenAsync(
                        dsrNoSessionToken,
                        ConsistencyLevel.Session,
                        sMock.Object,
                        partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                        clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


                    if (dsrNoSessionToken.IsReadOnlyRequest || dsrNoSessionToken.OperationType == OperationType.Batch)
                    {
                        Assert.AreEqual(dsrSessionToken, dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                    }
                    else
                    {
                        Assert.IsNull(dsrNoSessionToken.Headers[HttpConstants.HttpHeaders.SessionToken]);
                    }
                }
            }

            // Verify stored procedure execute
            Assert.IsFalse(GatewayStoreModel.IsMasterOperation(
                               ResourceType.StoredProcedure,
                               OperationType.ExecuteJavaScript));

            DocumentServiceRequest dsrSprocExecute = DocumentServiceRequest.CreateFromName(
                OperationType.ExecuteJavaScript,
                "Test",
                ResourceType.StoredProcedure,
                AuthorizationTokenType.PrimaryMasterKey);

            string sessionToken = Guid.NewGuid().ToString();

            dsrSprocExecute.Headers.Add(HttpConstants.HttpHeaders.SessionToken, sessionToken);

            await GatewayStoreModel.ApplySessionTokenAsync(
                dsrSprocExecute,
                ConsistencyLevel.Session,
                new Mock <ISessionContainer>().Object,
                partitionKeyRangeCache : new Mock <PartitionKeyRangeCache>(null, null, null).Object,
                clientCollectionCache : new Mock <ClientCollectionCache>(new SessionContainer("testhost"), this.GetGatewayStoreModelForConsistencyTest(), null, null).Object);


            Assert.AreEqual(sessionToken, dsrSprocExecute.Headers[HttpConstants.HttpHeaders.SessionToken]);
        }