Giter Site home page Giter Site logo

Comments (5)

madelson avatar madelson commented on July 18, 2024

from distributedlock.

phoeniceus avatar phoeniceus commented on July 18, 2024

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.

madelson avatar madelson commented on July 18, 2024

from distributedlock.

madelson avatar madelson commented on July 18, 2024

@phoeniceus any update? I've been trying to reproduce this locally to no avail.

from distributedlock.

madelson avatar madelson commented on July 18, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.