diff --git a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs index fe67a5d2f..3d1a4b1a2 100644 --- a/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs +++ b/src/modules/Elsa.Workflows.Runtime/HealthChecks/ElsaDistributedLockHealthCheck.cs @@ -16,8 +16,6 @@ public class ElsaDistributedLockHealthCheck( IOptions options, ILogger logger) : IHealthCheck { - private static readonly string LockName = $"elsa-health-check-{Environment.MachineName}-{Guid.NewGuid():N}"; - /// public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { @@ -32,7 +30,8 @@ public class ElsaDistributedLockHealthCheck( }); } - await using var handle = await distributedLockProvider.TryAcquireLockAsync(LockName, options.Value.DistributedLockAcquisitionTimeout, cancellationToken); + var lockName = $"elsa-health-check-{Environment.MachineName}-{Guid.NewGuid():N}"; + await using var handle = await distributedLockProvider.TryAcquireLockAsync(lockName, options.Value.DistributedLockAcquisitionTimeout, cancellationToken); if (handle == null) { return HealthCheckResult.Degraded("Elsa distributed lock provider was reachable, but the probe lock was not acquired.", data: new Dictionary diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs index a3d35614c..ee7400b6a 100644 --- a/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs +++ b/test/unit/Elsa.Workflows.Runtime.UnitTests/HealthChecks/ElsaDistributedLockHealthCheckTests.cs @@ -35,6 +35,24 @@ public class ElsaDistributedLockHealthCheckTests await _distributedLock.Received(1).TryAcquireAsync(ExpectedLockAcquisitionTimeout, Arg.Any()); } + [Fact] + public async Task UsesUniqueProbeLockNameForEachCheck() + { + var lockNames = new List(); + var distributedLockProvider = Substitute.For(); + var distributedLock = Substitute.For(); + distributedLockProvider.CreateLock(Arg.Do(lockNames.Add)).Returns(distributedLock); + distributedLock.TryAcquireAsync(Arg.Any(), Arg.Any()) + .Returns(new ValueTask(Substitute.For())); + var sut = new ElsaDistributedLockHealthCheck(CreateServiceProvider(distributedLockProvider), CreateOptions(), NullLogger.Instance); + + await sut.CheckHealthAsync(new HealthCheckContext()); + await sut.CheckHealthAsync(new HealthCheckContext()); + + Assert.Equal(2, lockNames.Count); + Assert.NotEqual(lockNames[0], lockNames[1]); + } + [Fact] public async Task ReturnsDegradedWhenProbeLockCannotBeAcquired() {