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