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");
            }
        }
示例#3
0
        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);
        }
示例#4
0
 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);
         }
     });
 }
示例#5
0
 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);
            });
        }
示例#10
0
        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);
                }
            });
        }
示例#11
0
        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);
            }
        }