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:
parent
2ade23bc82
commit
bcccb80ad5
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue