< Summary

Information
Class: Elsa.Workflows.Runtime.Distributed.DistributedWorkflowDefinitionsRefresher
Assembly: Elsa.Workflows.Runtime.Distributed
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime.Distributed/Services/DistributedWorkflowDefinitionsRefresher.cs
Line coverage
100%
Covered lines: 20
Uncovered lines: 0
Coverable lines: 20
Total lines: 46
Line coverage: 100%
Branch coverage
60%
Covered branches: 6
Total branches: 10
Branch coverage: 60%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
RefreshWorkflowDefinitionsAsync()60%1010100%

File(s)

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

#LineLine coverage
 1using Elsa.Workflows.Runtime.Requests;
 2using Elsa.Workflows.Runtime.Responses;
 3using JetBrains.Annotations;
 4using Medallion.Threading;
 5using Microsoft.Extensions.Logging;
 6
 7namespace Elsa.Workflows.Runtime.Distributed;
 8
 9/// <summary>
 10/// Decorator class that adds distributed locking to the Workflow Definitions Refresher.
 11/// </summary>
 12[UsedImplicitly]
 713public class DistributedWorkflowDefinitionsRefresher(IWorkflowDefinitionsRefresher inner,
 714    IDistributedLockProvider distributedLockProvider,
 715    ILogger<DistributedWorkflowDefinitionsRefresher> logger) : IWorkflowDefinitionsRefresher
 16{
 17    /// <summary>
 18    /// This ensures that only one instance of the application can refresh a set of workflow definitions at a time, prev
 19    /// </summary>
 20    public async Task<RefreshWorkflowDefinitionsResponse> RefreshWorkflowDefinitionsAsync(RefreshWorkflowDefinitionsRequ
 21    {
 422        var isRefreshingAll = request.DefinitionIds == null || request.DefinitionIds.Count == 0;
 423        var lockKey = isRefreshingAll
 424            ? "WorkflowDefinitionsRefresher:All"
 825            : $"WorkflowDefinitionsRefresher:{string.Join(",", request.DefinitionIds!.OrderBy(x => x))}";
 26
 427        await using var distributedLock = await distributedLockProvider.TryAcquireLockAsync(
 428            lockKey,
 429            TimeSpan.Zero,
 430            cancellationToken);
 31
 432        if (distributedLock == null)
 33        {
 234            var logMessage = isRefreshingAll
 235                ? "Could not acquire lock for refreshing all workflow definitions. Another instance is already refreshin
 236                : "Could not acquire lock for refreshing workflow definitions. Another instance is already refreshing th
 37
 238            logger.LogInformation(logMessage);
 39
 240            var failedDefinitionIds = isRefreshingAll ? Array.Empty<string>() : request.DefinitionIds!;
 241            return new(Array.Empty<string>(), failedDefinitionIds, RefreshWorkflowDefinitionsStatus.AlreadyInProgress);
 42        }
 43
 244        return await inner.RefreshWorkflowDefinitionsAsync(request, cancellationToken);
 445    }
 46}