Comments (5)
from distributedlock.
Thanks. I will look into some of those options.
Locking strategy and code:
var sqlDistributedLockProvider = new DistributedLockProvider(_appSettings.SqlLockConnectionString, _log);
using (_sqlDistributedLockProvider.Lock(path))
{
// Do something with path
}
public class DistributedLockProvider
{
private string _connectionString;
private ILogger _log;
public DistributedLockProvider(string connectionString, ILogger log)
{
_connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
_log = log;
}
public IDisposable Lock(string path)
{
var pathString = SqlDistributedLock.GetSafeLockName(path);
var fileLock = new SqlDistributedLock(pathString, _connectionString, SqlDistributedLockConnectionStrategy.OptimisticConnectionMultiplexing);
/*
* We ask for locks so often, that we end up using up all the DB connections
* available in the pool. The next request throws an exception after the 100 second timeout.
* So, instead of calling Acquire(), which holds the connection until the lock is
* received, we will use TryAcquire(), which releases the connection if the lock is
* not available. This should reduce the load on the number of connections required.
*/
IDisposable result = null;
while (result == null)
{
try
{
result = fileLock.TryAcquire(timeout: new TimeSpan(0, 0, 10));
if (result == null)
{
_log?.Log(LogLevel.Debug, $"Could not acquire a lock for {pathString} within ten seconds. Will wait and try again.");
}
}
catch (Exception e)
{
// This usually indicates that we could not get a connection within the default 100 second timeout.
_log?.Log(LogLevel.Warning, e, $"Could not acquire a lock for {pathString}. Will wait and try again.");
}
if (result == null)
{
Task.Delay(1000).Wait();
}
}
return result;
}
}
All of our code is wrapped in extensive error trapping and logging, so if DIspose() failed there is a strong chance we'd see an exception message. But I cannot promise 100%.
We are not using Azure. I believe we are using SQL Server 2016.
from distributedlock.
from distributedlock.
@phoeniceus any update? I've been trying to reproduce this locally to no avail.
from distributedlock.
Closing due to inactivity/inability to reproduce.
@phoeniceus if you're still encountering this issue with the current version of the library please feel free to reopen and continue the discussion.
from distributedlock.
Related Issues (20)
- FileDistributedLock - Use FileSystemWatcher to optimize wait
- Where locks are stored when using Postgres HOT 3
- Postgres lock is not released in specific multi-threaded scenarios HOT 13
- Timeouts seems not work in DistributedLock.Redis HOT 5
- Update minimum SqlClient versions to avoid vulnerability HOT 2
- Postgres: consider leveraging batching for efficiency (newer versions only)
- Postgres: consider switching to positional parameter style
- Postgres: consider constructor with NpgsqlDatasource
- ZooKeeperNetEx connection loss issue: an acquired lock seems is not released HOT 50
- Azure: create the container on the fly if it does not exist HOT 4
- Increase in lost lock after upgrading to .NET 7, EF Core 7 and Microsoft.Data.SqlClient 5.0.1 HOT 21
- Add custom data to AzureBlobLeaseDistributedLock HOT 10
- Redis: RedisScript (LuaScript) execution error - CultureInfo problem HOT 7
- DistributedLock.Azure: Remove MaxNonInfiniteLeaseDuration HOT 2
- Use Distributed lock to manage multiple calls to the same Azure function HOT 2
- Postgres distributed lock using PgBouncer connection pooler HOT 8
- About Distribute Locking System using Redis HOT 2
- RobiniaDocs API Explorer HOT 8
- Postgres - Multiple threads successfully acquire the same lock HOT 3
- Concurrency with Redis Semaphore HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from distributedlock.