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);
        }
Beispiel #4
0
        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);
        }