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>
This commit is contained in:
copilot-swe-agent[bot] 2026-05-20 23:02:49 +00:00 committed by GitHub
parent 2ade23bc82
commit bcccb80ad5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 3 deletions

View file

@ -16,8 +16,6 @@ public class ElsaDistributedLockHealthCheck(
IOptions<ElsaReadinessHealthCheckOptions> options,
ILogger<ElsaDistributedLockHealthCheck> logger) : IHealthCheck
{
private static readonly string LockName = $"elsa-health-check-{Environment.MachineName}-{Guid.NewGuid():N}";
/// <inheritdoc />
public async Task<HealthCheckResult> 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<string, object>

View file

@ -35,6 +35,24 @@ public class ElsaDistributedLockHealthCheckTests
await _distributedLock.Received(1).TryAcquireAsync(ExpectedLockAcquisitionTimeout, Arg.Any<CancellationToken>());
}
[Fact]
public async Task UsesUniqueProbeLockNameForEachCheck()
{
var lockNames = new List<string>();
var distributedLockProvider = Substitute.For<IDistributedLockProvider>();
var distributedLock = Substitute.For<IDistributedLock>();
distributedLockProvider.CreateLock(Arg.Do<string>(lockNames.Add)).Returns(distributedLock);
distributedLock.TryAcquireAsync(Arg.Any<TimeSpan>(), Arg.Any<CancellationToken>())
.Returns(new ValueTask<IDistributedSynchronizationHandle?>(Substitute.For<IDistributedSynchronizationHandle>()));
var sut = new ElsaDistributedLockHealthCheck(CreateServiceProvider(distributedLockProvider), CreateOptions(), NullLogger<ElsaDistributedLockHealthCheck>.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()
{