< Summary

Information
Class: Elsa.Workflows.Runtime.Tasks.RefreshWorkflowDefinitionActivityRegistryTask
Assembly: Elsa.Workflows.Runtime
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Tasks/RefreshWorkflowDefinitionActivityRegistryTask.cs
Line coverage
100%
Covered lines: 20
Uncovered lines: 0
Coverable lines: 20
Total lines: 46
Line coverage: 100%
Branch coverage
91%
Covered branches: 11
Total branches: 12
Branch coverage: 91.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.cctor()100%11100%
ExecuteAsync()91.66%1212100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Runtime/Tasks/RefreshWorkflowDefinitionActivityRegistryTask.cs

#LineLine coverage
 1using Elsa.Common;
 2using Elsa.Common.Multitenancy;
 3using Elsa.Common.RecurringTasks;
 4using Elsa.Workflows.Management.Contracts;
 5using JetBrains.Annotations;
 6
 7namespace Elsa.Workflows.Runtime.Tasks;
 8
 9/// <summary>
 10/// Reconciles the local workflow-as-activity registry with shared definition changes.
 11/// </summary>
 12[UsedImplicitly]
 10013public class RefreshWorkflowDefinitionActivityRegistryTask(
 10014    IWorkflowDefinitionRegistryGenerationStore generationStore,
 10015    IWorkflowDefinitionActivityRegistryReconciler registryUpdater,
 10016    ITenantAccessor tenantAccessor,
 10017    TimeProvider timeProvider) : RecurringTask
 18{
 219    private static readonly TimeSpan FullReconciliationInterval = TimeSpan.FromMinutes(1);
 20    private long? _tenantGeneration;
 21    private long? _agnosticGeneration;
 22    private long? _lastFullReconciliationTimestamp;
 23
 24    /// <inheritdoc />
 25    public override async Task ExecuteAsync(CancellationToken cancellationToken = default)
 26    {
 27        // The default in-memory store is node-local, so polling it cannot discover remote writes.
 94128        if (!generationStore.IsShared)
 15929            return;
 30
 78231        var tenantId = tenantAccessor.TenantId ?? Tenant.DefaultTenantId;
 78232        var tenantGeneration = await generationStore.GetGenerationAsync(tenantId, cancellationToken);
 78233        var agnosticGeneration = await generationStore.GetGenerationAsync(Tenant.AgnosticTenantId, cancellationToken);
 78234        var timestamp = timeProvider.GetTimestamp();
 78235        var fullReconciliationDue = _lastFullReconciliationTimestamp == null || timeProvider.GetElapsedTime(_lastFullRec
 36
 78237        if (!fullReconciliationDue && tenantGeneration == _tenantGeneration && agnosticGeneration == _agnosticGeneration
 59738            return;
 39
 40        // Keep the observed values from before the refresh. A concurrent write is therefore seen on the next poll.
 18541        await registryUpdater.ReconcileRegistryAsync(cancellationToken);
 18542        _tenantGeneration = tenantGeneration;
 18543        _agnosticGeneration = agnosticGeneration;
 18544        _lastFullReconciliationTimestamp = timestamp;
 94145    }
 46}