private IDisposable AcquireLock(string resource, TimeSpan timeout) { if (_dedicatedConnection == null) { _dedicatedConnection = _storage.CreateAndOpenConnection(); } var lockId = Guid.NewGuid(); if (!_lockedResources.ContainsKey(resource)) { try { SqlServerDistributedLock.Acquire(_dedicatedConnection, resource, timeout); } catch (Exception) { ReleaseLock(resource, lockId, true); throw; } _lockedResources.Add(resource, new HashSet <Guid>()); } _lockedResources[resource].Add(lockId); return(new DisposableLock(this, resource, lockId)); }
public SqlServerDistributedLock([NotNull] SqlServerStorage storage, [NotNull] string resource, TimeSpan timeout) { if (storage == null) { throw new ArgumentNullException("storage"); } if (String.IsNullOrEmpty(resource)) { throw new ArgumentNullException("resource"); } if ((timeout.TotalSeconds + CommandTimeoutAdditionSeconds) > Int32.MaxValue) { throw new ArgumentException(string.Format("The timeout specified is too large. Please supply a timeout equal to or less than {0} seconds", Int32.MaxValue - CommandTimeoutAdditionSeconds), "timeout"); } _storage = storage; _resource = resource; _connection = storage.CreateAndOpenConnection(); if (!AcquiredLocks.Value.ContainsKey(_resource) || AcquiredLocks.Value[_resource] == 0) { Acquire(_connection, _resource, timeout); if (!_storage.IsExistingConnection(_connection)) { _timer = new Timer(ExecuteKeepAliveQuery, null, TimeSpan.Zero, KeepAliveInterval); } AcquiredLocks.Value[_resource] = 1; } else { AcquiredLocks.Value[_resource]++; } }
public SqlServerDistributedLock([NotNull] SqlServerStorage storage, [NotNull] string resource, TimeSpan timeout) { if (storage == null) { throw new ArgumentNullException(nameof(storage)); } if (String.IsNullOrEmpty(resource)) { throw new ArgumentNullException(nameof(resource)); } if (timeout.TotalSeconds + CommandTimeoutAdditionSeconds > Int32.MaxValue) { throw new ArgumentException( $"The timeout specified is too large. Please supply a timeout equal to or less than {Int32.MaxValue - CommandTimeoutAdditionSeconds} seconds", nameof(timeout)); } if (timeout.TotalMilliseconds > Int32.MaxValue) { throw new ArgumentException( $"The timeout specified is too large. Please supply a timeout equal to or less than {(int)TimeSpan.FromMilliseconds(Int32.MaxValue).TotalSeconds} seconds", nameof(timeout)); } _storage = storage; _resource = resource; if (!AcquiredLocks.Value.ContainsKey(_resource) || AcquiredLocks.Value[_resource] == 0) { _connection = storage.CreateAndOpenConnection(); try { Acquire(_connection, _resource, timeout); } catch (Exception) { storage.ReleaseConnection(_connection); throw; } if (!_storage.IsExistingConnection(_connection)) { _timer = new Timer(ExecuteKeepAliveQuery, null, KeepAliveInterval, KeepAliveInterval); } AcquiredLocks.Value[_resource] = 1; } else { AcquiredLocks.Value[_resource]++; } }
public void Execute(CancellationToken cancellationToken) { using (var connection = _storage.CreateAndOpenConnection()) { foreach (var table in ProcessedTables) { Logger.DebugFormat("Removing outdated records from table '{0}'...", table); connection.Execute( String.Format(@" set transaction isolation level read committed; delete from HangFire.[{0}] with (tablock) where ExpireAt < @now;", table), new { now = DateTime.UtcNow }); } } cancellationToken.WaitHandle.WaitOne(_checkInterval); }
public SqlServerDistributedLock([NotNull] SqlServerStorage storage, [NotNull] string resource, TimeSpan timeout) { if (storage == null) { throw new ArgumentNullException(nameof(storage)); } if (String.IsNullOrEmpty(resource)) { throw new ArgumentNullException(nameof(resource)); } _storage = storage; _resource = resource; if (!AcquiredLocks.Value.ContainsKey(_resource) || AcquiredLocks.Value[_resource] == 0) { _connection = storage.CreateAndOpenConnection(); try { Acquire(_connection, _resource, timeout); } catch (Exception) { storage.ReleaseConnection(_connection); throw; } if (!_storage.IsExistingConnection(_connection)) { _timer = new Timer(ExecuteKeepAliveQuery, null, KeepAliveInterval, KeepAliveInterval); } AcquiredLocks.Value[_resource] = 1; } else { AcquiredLocks.Value[_resource]++; } }