コード例 #1
0
        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;
                }
            }
        }
コード例 #2
0
        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;
            }
        }