private bool TryRelock(RemoteLockState remoteLockState)
        {
            var attempt = 1;

            while (true)
            {
                try
                {
                    using (metrics.CassandraImplRelockOp.NewContext(remoteLockState.ToString()))
                    {
                        var relocked = remoteLockImplementation.TryRelock(remoteLockState.LockId, remoteLockState.ThreadId);
                        if (!relocked)
                        {
                            logger.Error("Cannot relock. Possible lock metadata corruption for: {0}", remoteLockState);
                        }
                        return(relocked);
                    }
                }
                catch (Exception e)
                {
                    var shortSleep = ThreadLocalRandom.Instance.Next(50 * (int)Math.Exp(Math.Min(attempt++, 5)));
                    logger.Warn(e, "remoteLockImplementation.Relock() failed for: {0}. Will sleep for {1} ms", remoteLockState, shortSleep);
                    Thread.Sleep(shortSleep);
                }
            }
        }
 private void Unlock(RemoteLockState remoteLockState)
 {
     lock (remoteLockState)
     {
         remoteLockState.NextKeepAliveMoment = null;
         try
         {
             using (metrics.CassandraImplUnlockOp.NewContext(remoteLockState.ToString()))
             {
                 if (!remoteLockImplementation.TryUnlock(remoteLockState.LockId, remoteLockState.ThreadId))
                 {
                     logger.Error("Cannot unlock. Possible lock metadata corruption for: {0}", remoteLockState);
                 }
             }
         }
         catch (Exception e)
         {
             logger.Error(e, "remoteLockImplementation.Unlock() failed for: {0}", remoteLockState);
         }
     }
 }
Ejemplo n.º 3
0
        private bool TryRelock([NotNull] RemoteLockState remoteLockState)
        {
            var attempt = 1;

            while (true)
            {
                var nextHeartbeatMoment = Timestamp.Now;
                if (remoteLockState.HeartbeatMoment.Add(lockTtl.Multiply(0.5)) < nextHeartbeatMoment)
                {
                    logger.Error("KeepLockAlive() freeze is detected on attempt #{0}. Signal LockAliveToken to prevent possible lock collision for: {1}", attempt, remoteLockState);
                    return(false);
                }

                try
                {
                    using (metrics.CassandraImplRelockOp.NewContext(remoteLockState.ToString()))
                    {
                        var relocked = remoteLockImplementation.TryRelock(remoteLockState.LockId, remoteLockState.ThreadId);

                        if (relocked)
                        {
                            remoteLockState.HeartbeatMoment = nextHeartbeatMoment;
                        }
                        else
                        {
                            logger.Error("Cannot relock on attempt #{0}. Possible lock metadata corruption for: {1}", attempt, remoteLockState);
                        }

                        return(relocked);
                    }
                }
                catch (Exception e)
                {
                    var shortSleep = ThreadLocalRandom.Instance.Next(50 * (int)Math.Exp(Math.Min(attempt++, 5)));
                    logger.Warn(e, "remoteLockImplementation.TryRelock() attempt #{0} failed for: {1}. Will sleep for {2} ms", attempt, remoteLockState, shortSleep);
                    Thread.Sleep(shortSleep);
                }
            }
        }