private bool TryGetDocumentsFromQueue(Etag nextDocEtag, ref List <JsonDocument> items) { JsonDocument result; nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); bool hasDocs = false; while (items.Count < autoTuner.NumberOfItemsToIndexInSingleBatch && prefetchingQueue.TryPeek(out result) && nextDocEtag.CompareTo(result.Etag) >= 0) { // safe to do peek then dequeue because we are the only one doing the dequeues // and here we are single threaded prefetchingQueue.TryDequeue(out result); if (result.Etag != nextDocEtag) { continue; } items.Add(result); hasDocs = true; nextDocEtag = EtagUtil.Increment(nextDocEtag, 1); nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); } return(hasDocs); }
public void ConcurrentJsonDocumentSortedListShouldSortByEtag() { var list = new ConcurrentJsonDocumentSortedList(); var etag1 = EtagUtil.Increment(Etag.Empty, 1); var etag2 = EtagUtil.Increment(Etag.Empty, 2); var etag3 = EtagUtil.Increment(Etag.Empty, 3); var etag4 = EtagUtil.Increment(Etag.Empty, 4); var doc1 = new JsonDocument { Etag = etag1 }; var doc2 = new JsonDocument { Etag = etag2 }; var doc3 = new JsonDocument { Etag = etag3 }; var doc4 = new JsonDocument { Etag = etag4 }; using (list.EnterWriteLock()) { list.Add(doc4); list.Add(doc2); list.Add(doc1); list.Add(doc3); } JsonDocument result; Assert.True(list.TryDequeue(out result)); Assert.Equal(doc1.Etag, result.Etag); Assert.True(list.TryDequeue(out result)); Assert.Equal(doc2.Etag, result.Etag); Assert.True(list.TryDequeue(out result)); Assert.Equal(doc3.Etag, result.Etag); Assert.True(list.TryDequeue(out result)); Assert.Equal(doc4.Etag, result.Etag); }
private bool TryGetDocumentsFromQueue(Etag nextDocEtag, List <JsonDocument> items, int?take) { JsonDocument result; nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); bool hasDocs = false; while (items.Count < autoTuner.NumberOfItemsToProcessInSingleBatch && prefetchingQueue.TryPeek(out result) && // we compare to current or _smaller_ so we will remove from the queue old versions // of documents that we have already loaded nextDocEtag.CompareTo(result.Etag) >= 0) { // safe to do peek then dequeue because we are the only one doing the dequeues // and here we are single threaded, but still, better to check if (prefetchingQueue.TryDequeue(out result) == false) { continue; } // this shouldn't happen, but... if (result == null) { continue; } if (result.Etag != nextDocEtag) { continue; } items.Add(result); hasDocs = true; if (take.HasValue && items.Count >= take.Value) { break; } nextDocEtag = Abstractions.Util.EtagUtil.Increment(nextDocEtag, 1); nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); } return(hasDocs); }
private bool TryGetDocumentsFromQueue(Etag nextDocEtag, ref List <JsonDocument> items) { JsonDocument result; nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); bool hasDocs = false; while (items.Count < autoTuner.NumberOfItemsToIndexInSingleBatch && prefetchingQueue.TryPeek(out result) && nextDocEtag.CompareTo(result.Etag) >= 0) { // safe to do peek then dequeue because we are the only one doing the dequeues // and here we are single threaded, but still, better to check if (prefetchingQueue.TryDequeue(out result) == false) { continue; } // this shouldn't happen, but... if (result == null) { continue; } if (result.Etag != nextDocEtag) { continue; } items.Add(result); hasDocs = true; nextDocEtag = Abstractions.Util.EtagUtil.Increment(nextDocEtag, 1); nextDocEtag = HandleEtagGapsIfNeeded(nextDocEtag); } return(hasDocs); }