public FeedTokenEPKRange( string containerRid, Documents.PartitionKeyRange keyRange) : this(containerRid) { if (keyRange == null) { throw new ArgumentNullException(nameof(keyRange)); } this.CompleteRange = new Documents.Routing.Range <string>(keyRange.MinInclusive, keyRange.MaxExclusive, true, false); this.CompositeContinuationTokens.Enqueue(FeedTokenEPKRange.CreateCompositeContinuationTokenForRange(keyRange.MinInclusive, keyRange.MaxExclusive, null)); this.currentToken = this.CompositeContinuationTokens.Peek(); }
private void HandleSplit(IReadOnlyList <Documents.PartitionKeyRange> keyRanges) { if (keyRanges == null) { throw new ArgumentNullException(nameof(keyRanges)); } // Update current Documents.PartitionKeyRange firstRange = keyRanges[0]; this.currentToken.Range = new Documents.Routing.Range <string>(firstRange.MinInclusive, firstRange.MaxExclusive, true, false); // Add children foreach (Documents.PartitionKeyRange keyRange in keyRanges.Skip(1)) { this.CompositeContinuationTokens.Enqueue(FeedTokenEPKRange.CreateCompositeContinuationTokenForRange(keyRange.MinInclusive, keyRange.MaxExclusive, this.currentToken.Token)); } }
public FeedTokenEPKRange( string containerRid, IReadOnlyList <Documents.PartitionKeyRange> keyRanges) : this(containerRid) { if (keyRanges == null) { throw new ArgumentNullException(nameof(keyRanges)); } if (keyRanges.Count == 0) { throw new ArgumentOutOfRangeException(nameof(keyRanges)); } this.CompleteRange = new Documents.Routing.Range <string>(keyRanges[0].MinInclusive, keyRanges[keyRanges.Count - 1].MaxExclusive, true, false); foreach (Documents.PartitionKeyRange keyRange in keyRanges) { this.CompositeContinuationTokens.Enqueue(FeedTokenEPKRange.CreateCompositeContinuationTokenForRange(keyRange.MinInclusive, keyRange.MaxExclusive, null)); } this.currentToken = this.CompositeContinuationTokens.Peek(); }
public override async Task <bool> ShouldRetryAsync( ContainerCore containerCore, ResponseMessage responseMessage, CancellationToken cancellationToken = default(CancellationToken)) { if (this.FeedTokenEPKRange != null) { return(await this.FeedTokenEPKRange.ShouldRetryAsync(containerCore, responseMessage, cancellationToken)); } if (responseMessage.IsSuccessStatusCode) { return(false); } bool partitionSplit = responseMessage.StatusCode == HttpStatusCode.Gone && (responseMessage.Headers.SubStatusCode == Documents.SubStatusCodes.PartitionKeyRangeGone || responseMessage.Headers.SubStatusCode == Documents.SubStatusCodes.CompletingSplit); if (partitionSplit) { string containerRid = await containerCore.GetRIDAsync(cancellationToken); Routing.PartitionKeyRangeCache partitionKeyRangeCache = await containerCore.ClientContext.DocumentClient.GetPartitionKeyRangeCacheAsync(); IReadOnlyList <Documents.PartitionKeyRange> keyRanges = await partitionKeyRangeCache.TryGetOverlappingRangesAsync( containerRid, new Documents.Routing.Range <string>( Documents.Routing.PartitionKeyInternal.MinimumInclusiveEffectivePartitionKey, Documents.Routing.PartitionKeyInternal.MaximumExclusiveEffectivePartitionKey, isMaxInclusive: false, isMinInclusive: true), forceRefresh : true); List <Documents.PartitionKeyRange> addedRanges = keyRanges.Where(range => range.Parents.Contains(this.PartitionKeyRangeId)).ToList(); if (addedRanges.Count == 0) { DefaultTrace.TraceError("FeedTokenPartitionKeyRange - Could not obtain children after split for {0}", this.PartitionKeyRangeId); return(false); } this.FeedTokenEPKRange = new FeedTokenEPKRange(containerRid, new Documents.Routing.Range <string>(addedRanges[0].MinInclusive, addedRanges[addedRanges.Count - 1].MaxExclusive, true, false), addedRanges.Select(range => FeedTokenEPKRange.CreateCompositeContinuationTokenForRange(range.MinInclusive, range.MaxExclusive, this.continuationToken)).ToList()); return(true); } return(false); }