internal static async Task ApplySessionTokenAsync( DocumentServiceRequest request, ConsistencyLevel defaultConsistencyLevel, ISessionContainer sessionContainer, PartitionKeyRangeCache partitionKeyRangeCache, CollectionCache clientCollectionCache, IGlobalEndpointManager globalEndpointManager) { if (request.Headers == null) { Debug.Fail("DocumentServiceRequest does not have headers."); return; } // Master resource operations don't require session token. if (GatewayStoreModel.IsMasterOperation(request.ResourceType, request.OperationType)) { if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { request.Headers.Remove(HttpConstants.HttpHeaders.SessionToken); } return; } if (!string.IsNullOrEmpty(request.Headers[HttpConstants.HttpHeaders.SessionToken])) { return; // User is explicitly controlling the session. } string requestConsistencyLevel = request.Headers[HttpConstants.HttpHeaders.ConsistencyLevel]; bool isReadOrBatchRequest = request.IsReadOnlyRequest || request.OperationType == OperationType.Batch; bool requestHasConsistencySet = !string.IsNullOrEmpty(requestConsistencyLevel) && isReadOrBatchRequest; // Only read requests can have their consistency modified bool sessionConsistencyApplies = (!requestHasConsistencySet && defaultConsistencyLevel == ConsistencyLevel.Session) || (requestHasConsistencySet && string.Equals(requestConsistencyLevel, GatewayStoreModel.sessionConsistencyAsString, StringComparison.OrdinalIgnoreCase)); bool isMultiMasterEnabledForRequest = globalEndpointManager.CanUseMultipleWriteLocations(request); if (!sessionConsistencyApplies || (!isReadOrBatchRequest && !isMultiMasterEnabledForRequest)) { return; // Only apply the session token in case of session consistency and the request is read only or read/write on multimaster } (bool isSuccess, string sessionToken) = await GatewayStoreModel.TryResolveSessionTokenAsync( request, sessionContainer, partitionKeyRangeCache, clientCollectionCache); if (isSuccess && !string.IsNullOrEmpty(sessionToken)) { request.Headers[HttpConstants.HttpHeaders.SessionToken] = sessionToken; } }
public GlobalPartitionEndpointManagerCore( IGlobalEndpointManager globalEndpointManager) { this.globalEndpointManager = globalEndpointManager ?? throw new ArgumentNullException(nameof(globalEndpointManager)); }