internal async Task <List <PartitionKeyRange> > GetTargetPartitionKeyRangesAsync(string collectionResourceId, List <Range <string> > providedRanges) { if (string.IsNullOrEmpty(nameof(collectionResourceId))) { throw new ArgumentNullException(); } if (providedRanges == null || !providedRanges.Any()) { throw new ArgumentNullException(nameof(providedRanges)); } IRoutingMapProvider routingMapProvider = await this.Client.GetRoutingMapProviderAsync(); List <PartitionKeyRange> ranges = await routingMapProvider.TryGetOverlappingRangesAsync(collectionResourceId, providedRanges); if (ranges == null && PathsHelper.IsNameBased(this.ResourceLink)) { // Refresh the cache and don't try to re-resolve collection as it is not clear what already // happened based on previously resolved collection rid. // Return NotFoundException this time. Next query will succeed. // This can only happen if collection is deleted/created with same name and client was not restarted // in between. CollectionCache collectionCache = await this.Client.GetCollectionCacheAsync(); collectionCache.Refresh(this.ResourceLink); } if (ranges == null) { throw new NotFoundException($"{DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture)}: GetTargetPartitionKeyRanges(collectionResourceId:{collectionResourceId}, providedRanges: {string.Join(",", providedRanges)} failed due to stale cache"); } return(ranges); }
public async Task <PartitionKeyRange> GetTargetPartitionKeyRangeByIdAsync(string collectionResourceId, string partitionKeyRangeId) { IRoutingMapProvider routingMapProvider = await this.Client.GetRoutingMapProviderAsync(); PartitionKeyRange range = await routingMapProvider.TryGetPartitionKeyRangeByIdAsync(collectionResourceId, partitionKeyRangeId); if (range == null && PathsHelper.IsNameBased(this.ResourceLink)) { // Refresh the cache and don't try to reresolve collection as it is not clear what already // happened based on previously resolved collection rid. // Return NotFoundException this time. Next query will succeed. // This can only happen if collection is deleted/created with same name and client was not restarted // inbetween. CollectionCache collectionCache = await this.Client.GetCollectionCacheAsync(); collectionCache.Refresh(this.ResourceLink); } if (range == null) { throw new NotFoundException($"{DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture)}: GetTargetPartitionKeyRangeById(collectionResourceId:{collectionResourceId}, partitionKeyRangeId: {partitionKeyRangeId}) failed due to stale cache"); } return(range); }