public override async Task <CollectionRoutingMap> GetRoutingMapAsync(CancellationToken cancellationToken) { string collectionRid = await this.GetCachedRIDAsync( forceRefresh : false, trace : NoOpTrace.Singleton, cancellationToken); PartitionKeyRangeCache partitionKeyRangeCache = await this.ClientContext.Client.DocumentClient.GetPartitionKeyRangeCacheAsync(NoOpTrace.Singleton); CollectionRoutingMap collectionRoutingMap = await partitionKeyRangeCache.TryLookupAsync( collectionRid, previousValue : null, request : null, cancellationToken, NoOpTrace.Singleton); // Not found. if (collectionRoutingMap == null) { collectionRid = await this.GetCachedRIDAsync( forceRefresh : true, trace : NoOpTrace.Singleton, cancellationToken); collectionRoutingMap = await partitionKeyRangeCache.TryLookupAsync( collectionRid, previousValue : null, request : null, cancellationToken, NoOpTrace.Singleton); } return(collectionRoutingMap); }
internal override Task <CollectionRoutingMap> GetRoutingMapAsync(CancellationToken cancellationToken) { string collectionRID = null; return(this.GetRIDAsync(cancellationToken) .ContinueWith(ridTask => { collectionRID = ridTask.Result; return this.ClientContext.Client.DocumentClient.GetPartitionKeyRangeCacheAsync(); }) .Unwrap() .ContinueWith(partitionKeyRangeCachetask => { PartitionKeyRangeCache partitionKeyRangeCache = partitionKeyRangeCachetask.Result; return partitionKeyRangeCache.TryLookupAsync( collectionRID, null, null, cancellationToken); }) .Unwrap()); }
private static async Task <Tuple <bool, PartitionKeyRange> > TryResolvePartitionKeyRangeAsync(DocumentServiceRequest request, ISessionContainer sessionContainer, PartitionKeyRangeCache partitionKeyRangeCache, ClientCollectionCache clientCollectionCache, bool refreshCache) { if (refreshCache) { request.ForceMasterRefresh = true; request.ForceNameCacheRefresh = true; } PartitionKeyRange partitonKeyRange = null; ContainerProperties collection = await clientCollectionCache.ResolveCollectionAsync(request, CancellationToken.None, NoOpTrace.Singleton); string partitionKeyString = request.Headers[HttpConstants.HttpHeaders.PartitionKey]; if (partitionKeyString != null) { CollectionRoutingMap collectionRoutingMap = await partitionKeyRangeCache.TryLookupAsync(collectionRid : collection.ResourceId, previousValue : null, request : request, cancellationToken : CancellationToken.None, NoOpTrace.Singleton); if (refreshCache && collectionRoutingMap != null) { collectionRoutingMap = await partitionKeyRangeCache.TryLookupAsync(collectionRid : collection.ResourceId, previousValue : collectionRoutingMap, request : request, cancellationToken : CancellationToken.None, NoOpTrace.Singleton); } partitonKeyRange = AddressResolver.TryResolveServerPartitionByPartitionKey(request: request, partitionKeyString: partitionKeyString, collectionCacheUptoDate: false, collection: collection, routingMap: collectionRoutingMap); } else if (request.PartitionKeyRangeIdentity != null) { PartitionKeyRangeIdentity partitionKeyRangeId = request.PartitionKeyRangeIdentity; partitonKeyRange = await partitionKeyRangeCache.TryGetPartitionKeyRangeByIdAsync(collection.ResourceId, partitionKeyRangeId.ToString(), NoOpTrace.Singleton, refreshCache); } if (partitonKeyRange == null) { if (refreshCache) { return(new Tuple <bool, PartitionKeyRange>(false, null)); } // need to refresh cache. Maybe split happened. return(await GatewayStoreModel.TryResolvePartitionKeyRangeAsync(request : request, sessionContainer : sessionContainer, partitionKeyRangeCache : partitionKeyRangeCache, clientCollectionCache : clientCollectionCache, refreshCache : true)); } return(new Tuple <bool, PartitionKeyRange>(true, partitonKeyRange)); }