Esempio n. 1
0
        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)
            {
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
 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();
         }
     }
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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();
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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();
            }
        }
Esempio n. 8
0
        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)
                {
                }
            }
        }