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); }
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); }
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)); }
public static string MainRowKey([NotNull] this NewLockMetadata lockMetadata) { return("Main_" + lockMetadata.LockRowId); }