From bcccb80ad57ab5e34bf0aaccc892cf5aa64932ae Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 20 May 2026 23:02:49 +0000 Subject: [PATCH] Use unique distributed lock health probes Agent-Logs-Url: https://github.com/elsa-workflows/elsa-core/sessions/71c9cf76-ccac-4020-87f4-1e4122d34645 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --- .../ElsaDistributedLockHealthCheck.cs | 5 ++--- .../ElsaDistributedLockHealthCheckTests.cs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) 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() {