public async Task VerifyCacheKeysAreCorrectAfterAbandonWithRetryDelay() { var queue = GetQueue(retries: 2, workItemTimeout: TimeSpan.FromMilliseconds(100), retryDelay: TimeSpan.FromMilliseconds(250), runQueueMaintenance: false) as RedisQueue <SimpleWorkItem>; if (queue == null) { return; } using (TestSystemClock.Install()) { using (queue) { var muxer = SharedConnection.GetMuxer(); var db = muxer.GetDatabase(); string listPrefix = muxer.IsCluster() ? "{q:SimpleWorkItem}" : "q:SimpleWorkItem"; string id = await queue.EnqueueAsync(new SimpleWorkItem { Data = "blah", Id = 1 }); var workItem = await queue.DequeueAsync(); await workItem.AbandonAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:wait")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(1, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":wait")); Assert.Equal(5, await muxer.CountAllKeysAsync()); TestSystemClock.AddTime(TimeSpan.FromSeconds(1)); await queue.DoMaintenanceWorkAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:wait")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(1, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":wait")); Assert.InRange(await muxer.CountAllKeysAsync(), 4, 5); workItem = await queue.DequeueAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:work")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(1, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.InRange(await muxer.CountAllKeysAsync(), 6, 7); await workItem.CompleteAsync(); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.InRange(await muxer.CountAllKeysAsync(), 0, 1); } } }
public async Task VerifyCacheKeysAreCorrectAfterAbandon() { var queue = GetQueue(retries: 2, workItemTimeout: TimeSpan.FromMilliseconds(100), retryDelay: TimeSpan.Zero, runQueueMaintenance: false) as RedisQueue <SimpleWorkItem>; if (queue == null) { return; } using (TestSystemClock.Install()) { using (queue) { var muxer = SharedConnection.GetMuxer(); var db = muxer.GetDatabase(); string listPrefix = muxer.IsCluster() ? "{q:SimpleWorkItem}" : "q:SimpleWorkItem"; string id = await queue.EnqueueAsync(new SimpleWorkItem { Data = "blah", Id = 1 }); _logger.LogTrace("SimpleWorkItem Id: {0}", id); var workItem = await queue.DequeueAsync(); await workItem.AbandonAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(1, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.Equal(4, await muxer.CountAllKeysAsync()); workItem = await queue.DequeueAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:work")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(1, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.Equal(6, await muxer.CountAllKeysAsync()); // let the work item timeout and become auto abandoned. TestSystemClock.AddTime(TimeSpan.FromMilliseconds(250)); await queue.DoMaintenanceWorkAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(2, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.Equal(1, (await queue.GetQueueStatsAsync()).Timeouts); Assert.InRange(await muxer.CountAllKeysAsync(), 3, 4); // should go to deadletter now workItem = await queue.DequeueAsync(); await workItem.AbandonAsync(); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id)); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:in")); Assert.Equal(0, await db.ListLengthAsync($"{listPrefix}:work")); Assert.Equal(1, await db.ListLengthAsync($"{listPrefix}:dead")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":dequeued")); Assert.True(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":enqueued")); Assert.False(await db.KeyExistsAsync("q:SimpleWorkItem:" + id + ":renewed")); Assert.Equal(3, await db.StringGetAsync("q:SimpleWorkItem:" + id + ":attempts")); Assert.InRange(await muxer.CountAllKeysAsync(), 4, 5); } } }