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); }
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); }
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); } }
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); }
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); }
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)); }