public void LockRepositoryTimeout() { var lockManager = new DistributedLockManager(GetLockProvider(DefaultLockDatabase)); using (var testLock = OtherThreadLockHelper.TryLock(this, lockManager, MultiprocessLockName, 0)) { Assert.IsNotNull(testLock, "Unable to lock the repository"); //now when we try to get it we should not, and should wait at least our timeout var lockStart = DateTimeOffset.Now; DistributedLock timeoutLock; Assert.IsFalse(lockManager.TryLock(this, MultiprocessLockName, 5, out timeoutLock)); using (timeoutLock) { //we shouldn't have the lock Assert.IsNull(timeoutLock, "Duplicate lock allowed"); //and we should be within a reasonable delta of our timeout. var delay = DateTimeOffset.Now - lockStart; Trace.Write(string.Format("Repository Timeout Requested: {0} Actual: {1}", 5, delay.TotalSeconds)); Assert.Greater(delay.TotalSeconds, 4.5, "Timeout happened too fast - {0} seconds", delay.TotalSeconds); Assert.Less(delay.TotalSeconds, 5.5, "Timeout happened too slow - {0} seconds", delay.TotalSeconds); } } }
private void HelperThreadStart() { DistributedLockManager.LockBarrier(); lock (m_Lock) { m_LockManager.TryLock(this, m_Name, m_Timeout, out m_RepositoryLock); if (m_RepositoryLock != null) { Monitor.PulseAll(m_Lock); while (m_Exiting == false) { Monitor.Wait(m_Lock); // Thread waits until we're told to exit. } m_RepositoryLock.Dispose(); // We're exiting, so it's time to release the lock! m_RepositoryLock = null; } // Otherwise, we couldn't get the lock. m_Exited = true; // Lock is released and thread is exiting. Monitor.PulseAll(m_Lock); } }
public void LockRepositoryTimeout() { const string MultiprocessLockName = "LockRepositoryTimeout"; var lockScopePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); try { var lockManager = new DistributedLockManager(new FileLockProvider(lockScopePath)); using (var testLock = OtherThreadLockHelper.TryLock(this, lockManager, MultiprocessLockName, 0)) { Assert.IsNotNull(testLock, "Unable to lock the repository"); //now when we try to get it we should not, and should wait at least our timeout var lockStart = DateTimeOffset.Now; DistributedLock timeoutLock; Assert.IsFalse(lockManager.TryLock(this, MultiprocessLockName, 5, out timeoutLock)); using (timeoutLock) { //we shouldn't have the lock Assert.IsNull(timeoutLock, "Duplicate lock allowed"); //and we should be within a reasonable delta of our timeout. var delay = DateTimeOffset.Now - lockStart; Trace.Write(string.Format("Repository Timeout Requested: {0} Actual: {1}", 5, delay.TotalSeconds)); Assert.Greater(delay.TotalSeconds, 4.5, "Timeout happened too fast - {0} seconds", delay.TotalSeconds); Assert.Less(delay.TotalSeconds, 5.5, "Timeout happened too slow - {0} seconds", delay.TotalSeconds); } } } finally { if (Directory.Exists(lockScopePath)) { Directory.Delete(lockScopePath, true); } } }