public void Ctor_WaitForLock_SignaledAtLockRelease() { var t = new Thread(() => { var lock1 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, new MongoStorageOptions(), _distributedLockMutex); using (lock1.AcquireLock()) { Thread.Sleep(TimeSpan.FromSeconds(3)); } }); t.Start(); // Wait just a bit to make sure the above lock is acuired Thread.Sleep(TimeSpan.FromSeconds(1)); // Record when we try to aquire the lock var startTime = DateTime.UtcNow; var lock2 = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(10), _database, new MongoStorageOptions(), _distributedLockMutex); using (lock2.AcquireLock()) { Assert.InRange(DateTime.UtcNow - startTime, TimeSpan.Zero, TimeSpan.FromSeconds(5)); } }
public void Ctor_ThrowsAnException_WhenResourceIsLocked() { var lock1 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, new MongoStorageOptions(), _distributedLockMutex); using (lock1.AcquireLock()) { var locksCount = _database.DistributedLock.Count( Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")); Assert.Equal(1, locksCount); var t = new Thread(() => { Assert.Throws <DistributedLockTimeoutException>(() => { var lock2 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, new MongoStorageOptions(), _distributedLockMutex); lock2.AcquireLock(); } ); }); t.Start(); Assert.True(t.Join(5000), "Thread is hanging unexpected"); } }
public MongoMigrationManager(MongoStorageOptions storageOptions, HangfireDbContext dbContext) { _storageOptions = storageOptions; _dbContext = dbContext; _migrationRunner = new MongoMigrationRunner(dbContext, storageOptions); var migrateLockCollection = _dbContext.Database.GetCollection <DistributedLockDto>(_migrateLockCollectionName); _lock = new MongoDistributedLock(nameof(Migrate), TimeSpan.FromSeconds(30), migrateLockCollection, _storageOptions); }
public void Ctor_SetLock_WhenResourceIsNotLocked() { UseConnection(database => { using (MongoDistributedLock @lock = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions())) { var locksCount = AsyncHelper.RunSync(() => database.DistributedLock.CountAsync(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1"))); Assert.Equal(1, locksCount); } }); }
public void Ctor_SetLock_WhenResourceIsNotLocked() { UseConnection(database => { using (MongoDistributedLock @lock = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions())) { var locksCount = database.DistributedLock.Count(Query <DistributedLockDto> .EQ(_ => _.Resource, "resource1")); Assert.Equal(1, locksCount); } }); }
public void Ctor_ThrowsAnException_WhenOptionsIsNull() { var exception = Assert.Throws <ArgumentNullException>(() => { var lock1 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, null, _distributedLockMutex); lock1.AcquireLock(); }); Assert.Equal("storageOptions", exception.ParamName); }
public void Ctor_ThrowsAnException_WhenResourceIsLocked() { UseConnection(database => { using (MongoDistributedLock @lock1 = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions())) { var locksCount = database.DistributedLock.Count(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")); Assert.Equal(1, locksCount); Assert.Throws <MongoDistributedLockException>(() => new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions())); } }); }
public void Ctor_SetLock_WhenResourceIsNotLocked() { var lock1 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, new MongoStorageOptions(), _distributedLockMutex); using (lock1.AcquireLock()) { var locksCount = _database.DistributedLock.Count(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")); Assert.Equal(1, locksCount); } }
public void Ctor_SetReleaseLock_WhenResourceIsNotLocked() { UseConnection(database => { long locksCount; using (MongoDistributedLock @lock = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions())) { locksCount = database.DistributedLock.Count(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")); Assert.Equal(1, locksCount); } locksCount = database.DistributedLock.Count(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")); Assert.Equal(0, locksCount); }); }
public void Ctor_SetLockHeartbeatWorks_WhenResourceIsNotLocked() { UseConnection(database => { using (MongoDistributedLock @lock = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions() { DistributedLockLifetime = TimeSpan.FromSeconds(3) })) { DateTime initialHeartBeat = database.GetServerTimeUtc(); Thread.Sleep(TimeSpan.FromSeconds(5)); DistributedLockDto lockEntry = AsyncHelper.RunSync(() => database.DistributedLock.Find(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")).FirstOrDefaultAsync()); Assert.NotNull(lockEntry); Assert.True(lockEntry.Heartbeat > initialHeartBeat); } }); }
public void Ctor_SetLockHeartbeatWorks_WhenResourceIsNotLocked() { UseConnection(database => { using (MongoDistributedLock @lock = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(1), database, new MongoStorageOptions() { DistributedLockLifetime = TimeSpan.FromSeconds(10) })) { DateTime initialHeartBeat = database.GetServerTimeUtc(); Thread.Sleep(TimeSpan.FromSeconds(3)); Thread.Sleep(TimeSpan.FromSeconds(60)); DistributedLockDto lockEntry = database.DistributedLock.FindOne(Query <DistributedLockDto> .EQ(_ => _.Resource, "resource1")); Assert.NotNull(lockEntry); Assert.True(lockEntry.Heartbeat > initialHeartBeat); } }); }
public void Ctor_AcquireLock_WhenLockExpired() { // simulate situation when lock was not disposed correctly (app crash) and there is no heartbeats to prolong ExpireAt value var initialExpireAt = DateTime.UtcNow.AddSeconds(3); _database.DistributedLock.InsertOne(new DistributedLockDto { ExpireAt = initialExpireAt, Resource = "resource1" }); var lock1 = new MongoDistributedLock("resource1", TimeSpan.FromSeconds(5), _database, new MongoStorageOptions(), _distributedLockMutex); using (lock1.AcquireLock()) { var lockEntry = _database.DistributedLock .Find(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")).Single(); Assert.True(lockEntry.ExpireAt > initialExpireAt); } }
public void Ctor_SetLockExpireAtWorks_WhenResourceIsNotLocked() { var lock1 = new MongoDistributedLock("resource1", TimeSpan.Zero, _database, new MongoStorageOptions() { DistributedLockLifetime = TimeSpan.FromSeconds(3) }, _distributedLockMutex); using (lock1.AcquireLock()) { DateTime initialExpireAt = DateTime.UtcNow; Thread.Sleep(TimeSpan.FromSeconds(5)); DistributedLockDto lockEntry = _database.DistributedLock .Find(Builders <DistributedLockDto> .Filter.Eq(_ => _.Resource, "resource1")).FirstOrDefault(); Assert.NotNull(lockEntry); Assert.True(lockEntry.ExpireAt > initialExpireAt); } }