Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error acquiring lock on PostgreSQL when using Npgsql 8.0 #174

Closed
wazzamatazz opened this issue Nov 15, 2023 · 5 comments
Closed

Error acquiring lock on PostgreSQL when using Npgsql 8.0 #174

wazzamatazz opened this issue Nov 15, 2023 · 5 comments
Labels
bug dependencies Pull requests that update a dependency file
Milestone

Comments

@wazzamatazz
Copy link

I'm using DistributedLock.Postgres in a project that is using EF Core 7 and Npgsql 7. If I update the project to use EF Core 8 and Npgsql 8 RC2 I am no longer able to acquire a lock. Instead, I see an error and stack trace like the following:

System.InvalidOperationException: Unexpected value '' from acquire command
   at Medallion.Threading.Postgres.PostgresAdvisoryLock.TryAcquireAsync(DatabaseConnection connection, String resourceName, TimeoutValue timeout, CancellationToken cancellationToken) in /_/DistributedLock.Postgres/PostgresAdvisoryLock.cs:line 112
   at Medallion.Threading.Internal.Data.MultiplexedConnectionLock.TryAcquireAsync[TLockCookie](String name, TimeoutValue timeout, IDbSynchronizationStrategy`1 strategy, TimeoutValue keepaliveCadence, CancellationToken cancellationToken, Boolean opportunistic) in /_/DistributedLock.Core/Internal/Data/MultiplexedConnectionLock.cs:line 74
   at Medallion.Threading.Internal.Data.MultiplexedConnectionLock.TryAcquireAsync[TLockCookie](String name, TimeoutValue timeout, IDbSynchronizationStrategy`1 strategy, TimeoutValue keepaliveCadence, CancellationToken cancellationToken, Boolean opportunistic) in /_/DistributedLock.Core/Internal/Data/MultiplexedConnectionLock.cs:line 94
   at Medallion.Threading.Internal.Data.MultiplexedConnectionLockPool.TryAcquireAsync[TLockCookie](String connectionString, String name, TimeoutValue timeout, IDbSynchronizationStrategy`1 strategy, TimeoutValue keepaliveCadence, CancellationToken cancellationToken) in /_/DistributedLock.Core/Internal/Data/MultiplexedConnectionLockPool.cs:line 91
   at Medallion.Threading.Internal.Data.MultiplexedConnectionLockPool.TryAcquireAsync[TLockCookie](String connectionString, String name, TimeoutValue timeout, IDbSynchronizationStrategy`1 strategy, TimeoutValue keepaliveCadence, CancellationToken cancellationToken) in /_/DistributedLock.Core/Internal/Data/MultiplexedConnectionLockPool.cs:line 97
   at Medallion.Threading.Internal.DistributedLockHelpers.Wrap[THandle](ValueTask`1 handleTask, Func`2 factory) in /_/DistributedLock.Core/Internal/DistributedLockHelpers.cs:line 41
   at Medallion.Threading.Internal.DistributedLockHelpers.ThrowTimeoutIfNull[T](ValueTask`1 task, String object) in /_/DistributedLock.Core/Internal/DistributedLockHelpers.cs:line 142

I am creating the lock by passing the connection string to the PostgresDistributedLock constructor rather than an IDbConnection instance but I've found that I get the same error regardless of which constructor I use.

Reverting to EF Core 7/Npgsql 7 immediately fixes the issue.

@Kaffeetasse
Copy link
Contributor

I think the reason is, the AcquireCommand returns now a null value instead of DBNull.

In this line:

acquireCommandResult = await acquireCommand.ExecuteScalarAsync(cancellationToken).ConfigureAwait(false);

@valentasm1
Copy link

valentasm1 commented Nov 21, 2023

Any workaround?

@madelson
Copy link
Owner

@Kaffeetasse appreciate the diagnosis. Seems like this is a breaking change in Npgsql (I wonder if it is intentional).

fixing this in the package would be very easy; we can simply detect when it gets the “wrong” value and convert to what we expect.

I’d be happy to look at a PR for this. Otherwise, I can hopefully get to it in a few weeks.

@madelson madelson added bug dependencies Pull requests that update a dependency file labels Nov 21, 2023
@valentasm1
Copy link

Any time when someone will find time to review and release it?

@madelson
Copy link
Owner

@valentasm1 I should be able to do it in the next few days.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug dependencies Pull requests that update a dependency file
Projects
None yet
Development

No branches or pull requests

4 participants