private void CreateIfNotExists() { try { using (var dc = DocumentStoreLocator.ResolveOrRoot(CommonConfiguration.CoreDatabaseRoute)) { var namedMutex = dc.Load <DistributedMutexDocument>(_name); if (null == namedMutex) { namedMutex = new DistributedMutexDocument { Name = _name, UnusedExpiration = _expireUnused, ExpirationTime = DateTime.UtcNow + _expireUnused, Acquirer = Guid.Empty }; dc.Store(namedMutex); dc.SaveChanges(); } } } catch (ConcurrencyException) { } }
public void RenewLease(object parm) { var ct = (CancellationToken)parm; while (!ct.IsCancellationRequested) { var startTime = DateTime.UtcNow; var expTime = DateTime.UtcNow + _renewWait; int retries = 0; bool taken = false; while (!taken && retries < 6) { try { if (ct.IsCancellationRequested) { return; } using (var dc = DocumentStoreLocator.ResolveOrRoot(CommonConfiguration.CoreDatabaseRoute)) { var namedMutex = dc.Load <DistributedMutexDocument>(_name); if (null != namedMutex && namedMutex.Acquirer == _acquirer) { namedMutex.ExpirationTime = DateTime.UtcNow + namedMutex.UnusedExpiration; namedMutex.AcquiredTime = DateTime.UtcNow; expTime = namedMutex.ExpirationTime; } dc.SaveChanges(); taken = true; } } catch (Exception) { retries += 1; if (retries > 5) { throw new AbandonedMutexException(); } } } if (ct.IsCancellationRequested) { return; } var waitTime = startTime + TimeSpan.FromMilliseconds(_renewWait.TotalMilliseconds / 2); var waitPeriod = waitTime - DateTime.UtcNow; if (waitPeriod.TotalSeconds < 1) { waitPeriod = TimeSpan.FromMilliseconds(100.0); } //System.Threading.Thread.Sleep(waitPeriod); ct.WaitHandle.WaitOne(waitPeriod); } }
public void Release() { StopRenewal(); using (var dc = DocumentStoreLocator.ResolveOrRoot(CommonConfiguration.CoreDatabaseRoute)) { var namedMutex = dc.Load <DistributedMutexDocument>(_name); if (null != namedMutex && namedMutex.Acquirer == _acquirer) { namedMutex.Acquirer = Guid.Empty; namedMutex.ExpirationTime = DateTime.UtcNow + namedMutex.UnusedExpiration; dc.SaveChanges(); } } }
public bool DeleteWorkspace() { using (var dc = DocumentStoreLocator.ResolveOrRoot(WorkspaceLocalConfig.OptionalConfigurationHostName)) { var wsd = dc.Load <WorkspaceDocument>(_name); if (null != wsd) { dc.Delete(wsd); dc.SaveChanges(); return(true); } } return(false); }
public void Batch(Action <IWorkspaceData> batchAction) { using (var dc = DocumentStoreLocator.ResolveOrRoot(WorkspaceLocalConfig.OptionalConfigurationHostName)) { var data = dc.Load <WorkspaceDocument>(_name); if (null == data) { data = new WorkspaceDocument() { Name = _name }; } batchAction(new WorkspaceDataProxy(data)); dc.Store(data); dc.SaveChanges(); } }
public bool Open() { var retval = false; CreateIfNotExists(); try { using (var dc = DocumentStoreLocator.ResolveOrRoot(CommonConfiguration.CoreDatabaseRoute)) { var namedMutex = dc.Load <DistributedMutexDocument>(_name); if (null == namedMutex) { return(retval); } if (namedMutex.Acquirer == Guid.Empty) { namedMutex.Acquirer = _acquirer; namedMutex.AcquiredTime = DateTime.UtcNow; namedMutex.ExpirationTime = DateTime.UtcNow + namedMutex.UnusedExpiration; dc.SaveChanges(); } } retval = true; } catch (ConcurrencyException) { } if (retval) { var ct = _cts.Token; _renewLease = Task.Factory.StartNew(RenewLease, ct, TaskCreationOptions.LongRunning); } return(retval); }
public void RegisterKeyOverloads(params Tuple <string, string>[] aliases) { using (var dc = DocumentStoreLocator.ResolveOrRoot(WorkspaceLocalConfig.OptionalConfigurationHostName)) { var data = dc.Load <WorkspaceDocument>(_name); if (null == data) { data = new WorkspaceDocument() { Name = _name }; } foreach (var alias in aliases) { data.Aliases.Add(alias.Item1, alias.Item2); } dc.Store(data); dc.SaveChanges(); } }
public void GroomExpired(object parm) { var ct = (CancellationToken)parm; while (!ct.IsCancellationRequested) { try { DateTime checkTime = DateTime.UtcNow - TimeSpan.FromSeconds(10); // grace period using (var dc = DocumentStoreLocator.ResolveOrRoot(CommonConfiguration.CoreDatabaseRoute)) { var expired = from mut in dc.Query <DistributedMutexDocument>() where mut.ExpirationTime < checkTime select mut; if (expired.Any()) { foreach (var mutex in expired) { if (ct.IsCancellationRequested) { return; } dc.Delete(mutex); } dc.SaveChanges(); } } ct.WaitHandle.WaitOne(3000); } catch (Exception) { } } }