Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
                }
            }
        }