Esempio n. 1
0
        public bool TryRelock([NotNull] string lockId, [NotNull] string threadId)
        {
            var lockMetadata = baseOperationsPerformer.TryGetLockMetadata(lockId);

            if (lockMetadata == null)
            {
                return(false);
            }
            var newThreshold    = NewThreshold(lockMetadata.GetPreviousThreshold());
            var newLockMetadata = new NewLockMetadata(lockMetadata.LockId, lockMetadata.LockRowId, lockMetadata.LockCount, newThreshold, threadId);

            baseOperationsPerformer.WriteThread(lockMetadata.MainRowKey(), newThreshold, threadId, LockTtl);
            baseOperationsPerformer.WriteLockMetadata(newLockMetadata, lockMetadata.Timestamp);
            baseOperationsPerformer.DeleteThread(lockMetadata.MainRowKey(), lockMetadata.GetPreviousThreshold(), threadId);
            return(true);
        }
Esempio n. 2
0
        public LockAttemptResult TryLock([NotNull] string lockId, [NotNull] string threadId)
        {
            var lockMetadata = baseOperationsPerformer.TryGetLockMetadata(lockId) ?? new LockMetadata(lockId, lockId, 0, null, null, 0L);
            var newThreshold = NewThreshold(lockMetadata.PreviousThreshold ?? (Timestamp.Now - TimeSpan.FromHours(1)).Ticks);

            LockAttemptResult result;
            var probableOwnerThreadId = lockMetadata.ProbableOwnerThreadId;

            if (!string.IsNullOrEmpty(probableOwnerThreadId) && baseOperationsPerformer.ThreadAlive(lockMetadata.LockRowId, lockMetadata.PreviousThreshold, probableOwnerThreadId))
            {
                if (probableOwnerThreadId == threadId)
                {
                    throw new InvalidOperationException($"TryLock(lockId = {lockId}, threadId = {threadId}): probableOwnerThreadId == threadId, though it seemed to be impossible!");
                }
                result = LockAttemptResult.AnotherOwner(probableOwnerThreadId);
            }
            else
            {
                result = RunBattle(lockMetadata, threadId, newThreshold);
            }

            if (result.Status == LockAttemptStatus.Success)
            {
                lockMetadata = baseOperationsPerformer.TryGetLockMetadata(lockId) ?? new LockMetadata(lockId, lockId, 0, null, null, 0L);

                if (lockMetadata.LockCount <= changeLockRowThreshold)
                {
                    var newLockMetadata = new NewLockMetadata(lockId, lockMetadata.LockRowId, lockMetadata.LockCount + 1, newThreshold, threadId);
                    baseOperationsPerformer.WriteLockMetadata(newLockMetadata, lockMetadata.Timestamp);
                }
                else
                {
                    var newLockMetadata = new NewLockMetadata(lockId, Guid.NewGuid().ToString(), 1, newThreshold, threadId);
                    baseOperationsPerformer.WriteThread(newLockMetadata.MainRowKey(), newThreshold, threadId, LockTtl);
                    baseOperationsPerformer.WriteLockMetadata(newLockMetadata, lockMetadata.Timestamp);
                    baseOperationsPerformer.WriteThread(lockMetadata.MainRowKey(), newThreshold, threadId, LockTtl.Multiply(10));
                }
            }
            return(result);
        }
Esempio n. 3
0
        public void WriteLockMetadata([NotNull] NewLockMetadata newLockMetadata, long oldLockMetadataTimestamp)
        {
            var newTimestamp = Math.Max(GetNowTicks(), oldLockMetadataTimestamp + ticksPerMicrosecond);
            var columns      = new List <Column>
            {
                new Column
                {
                    Name      = lockRowIdColumnName,
                    Value     = serializer.Serialize(newLockMetadata.LockRowId),
                    Timestamp = newTimestamp,
                    TTL       = (int?)lockMetadataTtl.TotalSeconds,
                },
                new Column
                {
                    Name      = lockCountColumnName,
                    Value     = serializer.Serialize(newLockMetadata.LockCount),
                    Timestamp = newTimestamp,
                    TTL       = (int?)lockMetadataTtl.TotalSeconds,
                },
                new Column
                {
                    Name      = previousThresholdColumnName,
                    Value     = serializer.Serialize(newLockMetadata.Threshold),
                    Timestamp = newTimestamp,
                    TTL       = (int?)lockMetadataTtl.TotalSeconds,
                },
                new Column
                {
                    Name      = probableOwnerThreadIdColumnName,
                    Value     = serializer.Serialize(newLockMetadata.OwnerThreadId),
                    Timestamp = newTimestamp,
                    TTL       = (int?)lockMetadataTtl.TotalSeconds,
                }
            };
            var rowKey = newLockMetadata.LockId.ToLockMetadataRowKey();

            MakeInConnection(connection => connection.AddBatch(rowKey, columns));
        }
Esempio n. 4
0
 public static string MainRowKey([NotNull] this NewLockMetadata lockMetadata)
 {
     return("Main_" + lockMetadata.LockRowId);
 }