예제 #1
0
        public IEnumerable <JsonDocument> GetDocumentsAfter(Etag etag, int take, long?maxSize = null, Etag untilEtag = null)
        {
            Api.JetSetCurrentIndex(session, Documents, "by_etag");
            Api.MakeKey(session, Documents, etag.TransformToValueForEsentSorting(), MakeKeyGrbit.NewKey);
            if (Api.TrySeek(session, Documents, SeekGrbit.SeekGT) == false)
            {
                yield break;
            }
            long totalSize = 0;
            int  count     = 0;

            do
            {
                if (untilEtag != null && count > 0)
                {
                    var docEtag = Etag.Parse(Api.RetrieveColumn(session, Documents, tableColumnsCache.DocumentsColumns["etag"]));
                    if (EtagUtil.IsGreaterThanOrEqual(docEtag, untilEtag))
                    {
                        yield break;
                    }
                }
                var readCurrentDocument = ReadCurrentDocument();
                totalSize += readCurrentDocument.SerializedSizeOnDisk;
                if (maxSize != null && totalSize > maxSize.Value)
                {
                    yield return(readCurrentDocument);

                    yield break;
                }
                yield return(readCurrentDocument);

                count++;
            } while (Api.TryMoveNext(session, Documents) && count < take);
        }
예제 #2
0
        private bool ShouldReplace(IndexReplaceInformation indexReplaceInformation, int indexId)
        {
            bool shouldReplace = false;

            Database.TransactionalStorage.Batch(accessor =>
            {
                if (indexReplaceInformation.Forced ||
                    Database.IndexStorage.IsIndexStale(indexId, Database.LastCollectionEtags) == false)
                {
                    shouldReplace = true; // always replace non-stale or forced indexes
                }
                else
                {
                    var replaceIndex = Database.IndexStorage.GetIndexInstance(indexId);

                    var statistics = accessor.Indexing.GetIndexStats(indexId);
                    if (replaceIndex.IsMapReduce == false)
                    {
                        if (statistics.LastIndexedEtag != null && EtagUtil.IsGreaterThanOrEqual(statistics.LastIndexedEtag, indexReplaceInformation.MinimumEtagBeforeReplace))
                        {
                            shouldReplace = true;
                        }
                    }

                    if (shouldReplace == false && indexReplaceInformation.ReplaceTimeUtc.HasValue && (indexReplaceInformation.ReplaceTimeUtc.Value - SystemTime.UtcNow).TotalSeconds < 0)
                    {
                        shouldReplace = true;
                    }
                }
            });
            return(shouldReplace);
        }
예제 #3
0
        public IEnumerable <JsonDocument> GetDocumentsAfter(Etag etag, int take, long?maxSize = null, Etag untilEtag = null)
        {
            var docs = storage.Documents["ByEtag"].SkipAfter(new RavenJObject {
                { "etag", etag.ToByteArray() }
            })
                       .Select(result => DocumentByKey(result.Value <string>("key"), null))
                       .Take(take);
            long totalSize = 0;
            int  count     = 0;

            foreach (var doc in docs)
            {
                totalSize += doc.SerializedSizeOnDisk;
                if (maxSize != null && totalSize > maxSize.Value)
                {
                    yield return(doc);

                    yield break;
                }
                if (untilEtag != null && count > 0)
                {
                    if (EtagUtil.IsGreaterThanOrEqual(doc.Etag, untilEtag))
                    {
                        yield break;
                    }
                }
                count++;
                yield return(doc);
            }
        }
예제 #4
0
        public void ReplaceIndexes(ICollection <int> indexIds)
        {
            if (indexIds.Count == 0 || indexesToReplace.Count == 0)
            {
                return;
            }

            var indexes = new Dictionary <int, IndexReplaceInformation>();

            foreach (var indexId in indexIds)
            {
                IndexReplaceInformation indexReplaceInformation;
                if (indexesToReplace.TryGetValue(indexId, out indexReplaceInformation) == false)
                {
                    continue;
                }

                var shouldReplace = false;
                Database.TransactionalStorage.Batch(accessor =>
                {
                    if (indexReplaceInformation.Forced ||
                        Database.IndexStorage.IsIndexStale(indexId, Database.LastCollectionEtags) == false)
                    {
                        shouldReplace = true;                         // always replace non-stale or forced indexes
                    }
                    else
                    {
                        var replaceIndex = Database.IndexStorage.GetIndexInstance(indexId);

                        var statistics = accessor.Indexing.GetIndexStats(indexId);
                        if (replaceIndex.IsMapReduce)
                        {
                            if (statistics.LastReducedEtag != null && EtagUtil.IsGreaterThanOrEqual(statistics.LastReducedEtag, indexReplaceInformation.MinimumEtagBeforeReplace))
                            {
                                shouldReplace = true;
                            }
                        }
                        else
                        {
                            if (statistics.LastIndexedEtag != null && EtagUtil.IsGreaterThanOrEqual(statistics.LastIndexedEtag, indexReplaceInformation.MinimumEtagBeforeReplace))
                            {
                                shouldReplace = true;
                            }
                        }

                        if (shouldReplace == false && indexReplaceInformation.ReplaceTimeUtc.HasValue && (indexReplaceInformation.ReplaceTimeUtc.Value - SystemTime.UtcNow).TotalSeconds < 0)
                        {
                            shouldReplace = true;
                        }
                    }
                });

                if (shouldReplace)
                {
                    indexes.Add(indexId, indexReplaceInformation);
                }
            }

            ReplaceIndexes(indexes);
        }
예제 #5
0
        public IEnumerable <JsonDocument> GetDocumentsAfter(Etag etag, int take, CancellationToken cancellationToken, long?maxSize = null, Etag untilEtag = null, TimeSpan?timeout = null)
        {
            Api.JetSetCurrentIndex(session, Documents, "by_etag");
            Api.MakeKey(session, Documents, etag.TransformToValueForEsentSorting(), MakeKeyGrbit.NewKey);
            if (Api.TrySeek(session, Documents, SeekGrbit.SeekGT) == false)
            {
                yield break;
            }
            long      totalSize = 0;
            int       count     = 0;
            Stopwatch duration  = null;

            if (timeout != null)
            {
                duration = Stopwatch.StartNew();
            }
            do
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (untilEtag != null && count > 0)
                {
                    var docEtag = Etag.Parse(Api.RetrieveColumn(session, Documents, tableColumnsCache.DocumentsColumns["etag"]));
                    if (EtagUtil.IsGreaterThanOrEqual(docEtag, untilEtag))
                    {
                        yield break;
                    }
                }
                var readCurrentDocument = ReadCurrentDocument();
                totalSize += readCurrentDocument.SerializedSizeOnDisk;
                if (maxSize != null && totalSize > maxSize.Value)
                {
                    yield return(readCurrentDocument);

                    yield break;
                }
                yield return(readCurrentDocument);

                count++;
                if (timeout != null)
                {
                    if (duration.Elapsed > timeout.Value)
                    {
                        yield break;
                    }
                }
            } while (Api.TryMoveNext(session, Documents) && count < take);
        }
예제 #6
0
            public Task <bool> MoveNextAsync()
            {
                Current = null;

                while (_reader.Read() && _reader.TokenType != JsonToken.EndArray)
                {
                    _cancellationToken.ThrowIfCancellationRequested();

                    var document = (RavenJObject)RavenJToken.ReadFrom(_reader);

                    var etag = Etag.Parse(document.Value <RavenJObject>("@metadata").Value <string>("@etag"));
                    if (EtagUtil.IsGreaterThanOrEqual(_afterEtag, etag))
                    {
                        continue;
                    }

                    Current = document as T;
                    return(new CompletedTask <bool>(true));
                }

                return(new CompletedTask <bool>(false));
            }