Skip to content

Commit 1ea7c68

Browse files
emilienbevjeffrymorris
authored andcommitted
NCBC-3758: PersistentQueue does not dequeue items in original FIFO order
Motivation ---------- This bug was introduced in SDK 3.4.15 following this change NCBC-3578. A bug in the PersistentQueue datastructure dequeues items in LIFO order (removes item at index -1), and returns the first item (at index 0) on each Dequeue(). Changes ------- Dequeue now targets the first element of the queue rather than the last. Change-Id: I2ca7a7eb7e7b2626513c82b7ade80df602321479 Reviewed-on: https://review.couchbase.org/c/couchbase-net-client/+/208536 Reviewed-by: Richard Ponton <richard.ponton@couchbase.com> Tested-by: Build Bot <build@couchbase.com>
1 parent 2daffc9 commit 1ea7c68

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

src/Couchbase/DataStructures/PersistentQueue.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ internal PersistentQueue(ICouchbaseCollection collection, string key, QueueOptio
3535
{
3636
try
3737
{
38-
var result = await Collection.LookupInAsync(Key, builder => builder.Get("[-1]"))
38+
var result = await Collection.LookupInAsync(Key, builder => builder.Get("[0]"))
3939
.ConfigureAwait(false);
4040
var item = result.ContentAs<TValue>(0);
4141

42-
await Collection.MutateInAsync(Key, builder => builder.Remove("[-1]"),
42+
await Collection.MutateInAsync(Key, builder => builder.Remove("[0]"),
4343
options => options.Cas(result.Cas)).ConfigureAwait(false);
4444

4545
return item;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Couchbase.CombinationTests.Fixtures;
4+
using Couchbase.Core.Exceptions.KeyValue;
5+
using Couchbase.KeyValue;
6+
using Xunit;
7+
using Xunit.Abstractions;
8+
9+
namespace Couchbase.CombinationTests.Tests.DataStructures;
10+
11+
12+
[Collection(CombinationTestingCollection.Name)]
13+
public class PersistentQueueTests
14+
{
15+
private readonly CouchbaseFixture _fixture;
16+
private readonly ITestOutputHelper _outputHelper;
17+
private TestHelper _testHelper;
18+
19+
public PersistentQueueTests(CouchbaseFixture fixture, ITestOutputHelper outputHelper)
20+
{
21+
_fixture = fixture;
22+
_outputHelper = outputHelper;
23+
_testHelper = new TestHelper(fixture);
24+
}
25+
26+
27+
[Fact]
28+
async Task Test_PersistentQueue_Enqueues_And_Dequeues_In_Correct_FIFO_Order()
29+
{
30+
var collection = await _fixture.GetDefaultCollection().ConfigureAwait(false);
31+
32+
var documentId = "QueueTest" + Guid.NewGuid();
33+
var queue = collection.Queue<int>(documentId);
34+
35+
for (var queueItem = 1; queueItem <= 5; queueItem++)
36+
{
37+
_outputHelper.WriteLine($"Enqueing {queueItem}");
38+
await queue.EnqueueAsync(queueItem).ConfigureAwait(false);
39+
}
40+
41+
var count = 1;
42+
while (true)
43+
{
44+
int currentPeek;
45+
try
46+
{
47+
currentPeek = await queue.PeekAsync().ConfigureAwait(false);
48+
}
49+
catch (PathNotFoundException)
50+
{
51+
break;
52+
}
53+
54+
Assert.Equal(count, currentPeek);
55+
_outputHelper.WriteLine($"Peeking at {currentPeek} before dequeing");
56+
await queue.DequeueAsync().ConfigureAwait(false);
57+
count++;
58+
59+
}
60+
}
61+
}

0 commit comments

Comments
 (0)