< Summary

Information
Class: Elsa.Workflows.Runtime.DefaultBookmarkQueuePurger
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/DefaultBookmarkQueuePurger.cs
Line coverage
100%
Covered lines: 64
Uncovered lines: 0
Coverable lines: 64
Total lines: 105
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
PurgeAsync()100%1010100%
PurgeDeadLettersAsync()100%22100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Services/DefaultBookmarkQueuePurger.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Common.Entities;
 3using Elsa.Common.Models;
 4using Elsa.Workflows.Runtime.Filters;
 5using Elsa.Workflows.Runtime.Options;
 6using Elsa.Workflows.Runtime.OrderDefinitions;
 7using JetBrains.Annotations;
 8using Microsoft.Extensions.Logging;
 9using Microsoft.Extensions.Options;
 10
 11namespace Elsa.Workflows.Runtime;
 12
 13[UsedImplicitly]
 8614public class DefaultBookmarkQueuePurger(
 8615    IBookmarkQueueStore store,
 8616    IBookmarkQueueDeadLetterStore deadLetterStore,
 8617    IBookmarkQueueDeadLetterManager deadLetterManager,
 8618    ISystemClock systemClock,
 8619    IOptions<BookmarkQueuePurgeOptions> options,
 8620    ILogger<DefaultBookmarkQueuePurger> logger) : IBookmarkQueuePurger
 21{
 22    public async Task PurgeAsync(CancellationToken cancellationToken = default)
 23    {
 1224        var now = systemClock.UtcNow;
 1225        var thresholdDate = now - options.Value.Ttl;
 26
 1227        logger.LogDebug("Purging bookmark queue items older than {ThresholdDate}.", thresholdDate);
 28
 529        while (true)
 30        {
 1731            var pageArgs = PageArgs.FromPage(0, options.Value.BatchSize);
 1732            var filter = new BookmarkQueueFilter
 1733            {
 1734                CreatedAtLessThan = thresholdDate
 1735            };
 1736            var order = new BookmarkQueueItemOrder<DateTimeOffset>(x => x.CreatedAt, OrderDirection.Ascending);
 1737            var page = await store.PageAsync(pageArgs, filter, order, cancellationToken);
 1738            var items = page.Items.ToList();
 39
 1740            if (items.Count == 0)
 41                break;
 42
 1443            var itemIds = items.Select(x => x.Id).ToList();
 644            var activeItemIds = (await store.FindManyAsync(new BookmarkQueueFilter
 645            {
 646                Ids = itemIds
 1147            }, cancellationToken)).Select(x => x.Id).ToList();
 648            var deadLetters = (await deadLetterManager.DeadLetterManyAsync(items, "Expired", cancellationToken: cancella
 549            var deletedCount = activeItemIds.Count == 0
 550                ? 0
 551                : await store.DeleteAsync(new BookmarkQueueFilter
 552                {
 553                    Ids = activeItemIds
 554                }, cancellationToken);
 555            var alreadyRemovedItemIds = itemIds.Except(activeItemIds).ToHashSet();
 56
 557            if (alreadyRemovedItemIds.Count > 0)
 58            {
 1459                foreach (var deadLetter in deadLetters.Where(x => x.CanReplay && x.Reason == "Expired" && alreadyRemoved
 60                {
 261                    deadLetter.CanReplay = false;
 262                    await deadLetterStore.SaveAsync(deadLetter, cancellationToken);
 63                }
 64            }
 65
 566            logger.LogInformation(
 567                "Recorded {DeadLetterCount} expired bookmark queue dead-letter items and deleted {DeletedCount} active q
 568                deadLetters.Count,
 569                deletedCount);
 570        }
 71
 1172        await PurgeDeadLettersAsync(now, cancellationToken);
 73
 1174        logger.LogDebug("Finished purging bookmark queue items.");
 1175    }
 76
 77    private async Task PurgeDeadLettersAsync(DateTimeOffset now, CancellationToken cancellationToken)
 78    {
 1179        var thresholdDate = now - options.Value.DeadLetterTtl;
 80
 1181        logger.LogDebug("Purging bookmark queue dead-letter items older than {ThresholdDate}.", thresholdDate);
 82
 183        while (true)
 84        {
 1285            var pageArgs = PageArgs.FromPage(0, options.Value.BatchSize);
 1286            var filter = new BookmarkQueueDeadLetterFilter
 1287            {
 1288                DeadLetteredAtLessThan = thresholdDate
 1289            };
 1290            var order = new BookmarkQueueDeadLetterItemOrder<DateTimeOffset>(x => x.DeadLetteredAt, OrderDirection.Ascen
 1291            var page = await deadLetterStore.PageAsync(pageArgs, filter, order, cancellationToken);
 1292            var items = page.Items;
 93
 1294            if (items.Count == 0)
 95                break;
 96
 197            await deadLetterStore.DeleteAsync(new BookmarkQueueDeadLetterFilter
 198            {
 199                Ids = items.Select(x => x.Id).ToList()
 1100            }, cancellationToken);
 101
 1102            logger.LogInformation("Purged {Count} bookmark queue dead-letter items.", items.Count);
 1103        }
 11104    }
 105}