private async Task <(ChangeFeedProcessorState, ResponseMessage)> GetRemainingWorkAsync( DocumentServiceLease existingLease, ITrace trace, CancellationToken cancellationToken) { using (ITrace getRemainingWorkTrace = trace.StartChild($"Get Remaining Work {existingLease.Id}", TraceComponent.ChangeFeed, TraceLevel.Info)) { using FeedIterator iterator = this.monitoredContainerFeedCreator( existingLease, existingLease.ContinuationToken, string.IsNullOrEmpty(existingLease.ContinuationToken)); try { ResponseMessage response = await iterator.ReadNextAsync(cancellationToken).ConfigureAwait(false); if (response.StatusCode != HttpStatusCode.NotModified) { response.EnsureSuccessStatusCode(); } long parsedLSNFromSessionToken = ChangeFeedEstimatorIterator.TryConvertToNumber(ExtractLsnFromSessionToken(response.Headers.Session)); IEnumerable <JObject> items = ChangeFeedEstimatorIterator.GetItemsFromResponse(response); long lastQueryLSN = items.Any() ? ChangeFeedEstimatorIterator.TryConvertToNumber(ChangeFeedEstimatorIterator.GetFirstItemLSN(items)) - 1 : parsedLSNFromSessionToken; if (lastQueryLSN < 0) { return(new ChangeFeedProcessorState(existingLease.CurrentLeaseToken, 1, existingLease.Owner), response); } long leaseTokenRemainingWork = parsedLSNFromSessionToken - lastQueryLSN; long estimation = leaseTokenRemainingWork < 0 ? 0 : leaseTokenRemainingWork; return(new ChangeFeedProcessorState(existingLease.CurrentLeaseToken, estimation, existingLease.Owner), response); } catch (Exception clientException) { Cosmos.Extensions.TraceException(clientException); DefaultTrace.TraceWarning("GetEstimateWork > exception: lease token '{0}'", existingLease.CurrentLeaseToken); throw; } } }
private async Task <(long, ResponseMessage)> GetRemainingWorkAsync( DocumentServiceLease existingLease, CancellationToken cancellationToken) { // Current lease schema maps Token to PKRangeId string partitionKeyRangeId = existingLease.CurrentLeaseToken; using FeedIterator iterator = this.monitoredContainerFeedCreator( partitionKeyRangeId, existingLease.ContinuationToken, string.IsNullOrEmpty(existingLease.ContinuationToken)); try { ResponseMessage response = await iterator.ReadNextAsync(cancellationToken).ConfigureAwait(false); if (response.StatusCode != HttpStatusCode.NotModified) { response.EnsureSuccessStatusCode(); } long parsedLSNFromSessionToken = ChangeFeedEstimatorIterator.TryConvertToNumber(ExtractLsnFromSessionToken(response.Headers[HttpConstants.HttpHeaders.SessionToken])); IEnumerable <JObject> items = ChangeFeedEstimatorIterator.GetItemsFromResponse(response); long lastQueryLSN = items.Any() ? ChangeFeedEstimatorIterator.TryConvertToNumber(ChangeFeedEstimatorIterator.GetFirstItemLSN(items)) - 1 : parsedLSNFromSessionToken; if (lastQueryLSN < 0) { return(1, response); } long leaseTokenRemainingWork = parsedLSNFromSessionToken - lastQueryLSN; return(leaseTokenRemainingWork < 0 ? 0 : leaseTokenRemainingWork, response); } catch (Exception clientException) { Cosmos.Extensions.TraceException(clientException); DefaultTrace.TraceWarning("GetEstimateWork > exception: lease token '{0}'", existingLease.CurrentLeaseToken); throw; } }