diff --git a/src/DaemonTests/Coordination/AdvisoryLocksTest.cs b/src/DaemonTests/Coordination/AdvisoryLocksTest.cs index c3d491cd99..1d03693f8f 100644 --- a/src/DaemonTests/Coordination/AdvisoryLocksTest.cs +++ b/src/DaemonTests/Coordination/AdvisoryLocksTest.cs @@ -6,6 +6,7 @@ using Marten.Testing.Harness; using Microsoft.Extensions.Logging.Abstractions; using Shouldly; +using Weasel.Postgresql; using Xunit; namespace DaemonTests.Coordination; diff --git a/src/Marten/Events/Daemon/Coordination/AdvisoryLock.cs b/src/Marten/Events/Daemon/Coordination/AdvisoryLock.cs deleted file mode 100644 index 4113f7f0ea..0000000000 --- a/src/Marten/Events/Daemon/Coordination/AdvisoryLock.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using JasperFx.Core; -using Medallion.Threading.Postgres; -using Microsoft.Extensions.Logging; -using Npgsql; -using Weasel.Core; - -namespace Marten.Events.Daemon.Coordination; - -internal class AdvisoryLock : IAdvisoryLock -{ - private readonly string _databaseName; - private readonly ILogger _logger; - private readonly Dictionary _handles = new(); - private readonly LightweightCache _distributedLockProviders; - - public AdvisoryLock(NpgsqlDataSource dataSource, ILogger logger, string databaseName) - { - _logger = logger; - - _distributedLockProviders = new LightweightCache( - (lockId => new PostgresDistributedLock(new PostgresAdvisoryLockKey(lockId), - EnsurePrimaryWhenMultiHost(dataSource)))); - _databaseName = databaseName; - } - - private static NpgsqlDataSource EnsurePrimaryWhenMultiHost(NpgsqlDataSource source) - { - if (source is NpgsqlMultiHostDataSource multiHostDataSource) - return multiHostDataSource.WithTargetSession(TargetSessionAttributes.ReadWrite); - - return source; - } - - public bool HasLock(int lockId) - { - return _handles.TryGetValue(lockId, out var handle) && !handle.HandleLostToken.IsCancellationRequested; - } - - public async Task TryAttainLockAsync(int lockId, CancellationToken token) - { - var locker = _distributedLockProviders[lockId]; - var handle = await locker.TryAcquireAsync(cancellationToken: token).ConfigureAwait(false); - if (handle is not null) - { - _handles[lockId] = handle; - return true; - } - return false; - } - - public async Task ReleaseLockAsync(int lockId) - { - if (_handles.Remove(lockId, out var handle)) - { - await handle.DisposeAsync().ConfigureAwait(false); - } - } - - public async ValueTask DisposeAsync() - { - foreach (var i in _handles.Keys) - { - if (_handles.Remove(i, out var handle)) - { - try - { - await handle.DisposeAsync().ConfigureAwait(false); - } - catch (InvalidOperationException) - { - // Underlying connection is already closed and there's nothing to dispose - } - catch (Exception e) - { - _logger.LogError(e, "Error trying to dispose of advisory locks for database {Identifier}", _databaseName); - } - } - } - } -} diff --git a/src/Marten/Events/Daemon/Coordination/MultiTenantedProjectionDistributor.cs b/src/Marten/Events/Daemon/Coordination/MultiTenantedProjectionDistributor.cs index 33dcd4f182..0228e6868c 100644 --- a/src/Marten/Events/Daemon/Coordination/MultiTenantedProjectionDistributor.cs +++ b/src/Marten/Events/Daemon/Coordination/MultiTenantedProjectionDistributor.cs @@ -7,6 +7,7 @@ using Marten.Storage; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Weasel.Postgresql; namespace Marten.Events.Daemon.Coordination; diff --git a/src/Marten/Events/Daemon/Coordination/SingleTenantProjectionDistributor.cs b/src/Marten/Events/Daemon/Coordination/SingleTenantProjectionDistributor.cs index 5314fec54b..bdf0e01c02 100644 --- a/src/Marten/Events/Daemon/Coordination/SingleTenantProjectionDistributor.cs +++ b/src/Marten/Events/Daemon/Coordination/SingleTenantProjectionDistributor.cs @@ -7,6 +7,7 @@ using Marten.Storage; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Weasel.Postgresql; namespace Marten.Events.Daemon.Coordination; diff --git a/src/Marten/Marten.csproj b/src/Marten/Marten.csproj index da71c56dbb..72e0b6872f 100644 --- a/src/Marten/Marten.csproj +++ b/src/Marten/Marten.csproj @@ -36,16 +36,16 @@ - - + - + - - + + +