private void InstanciateDummySharedObject() { AsyncDummySharedObjectId = SharedObjectId.FromString("AsyncDummySharedObjectId"); AsyncDummySharedObject = new DummySharedObject { DummyObjectName = "AsyncDummySharedObjectName", DummyObjectValue = "AsyncDummySharedObjectValue" }; DummySharedObjectId = SharedObjectId.FromString("DummySharedObjectId"); DummySharedObject = new DummySharedObject { DummyObjectName = "DummySharedObjectName", DummyObjectValue = "DummySharedObjectValue" }; }
private static RedisKey KeyOf(SharedObjectId sharedObjectId) { var key = (RedisKey)sharedObjectId.Value; return key; }
public async Task<object> ReadAsync(Type objectType, SharedObjectId sharedObjectId) { CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var key = KeyOf(sharedObjectId); var valueWithExpire = await Db.StringGetWithExpiryAsync(key); if (IsObjectExpired(valueWithExpire)) return null; var sharedObject = await DeserializeAsync(valueWithExpire.Value, objectType); return sharedObject; }
public async Task InsertAsync(SharedObjectId sharedObjectId, object sharedObject, TimeSpan objectLifespan = default(TimeSpan)) { CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var key = KeyOf(sharedObjectId); var value = await SerializeAsync(sharedObject); var timeout = objectLifespan != default(TimeSpan) ? objectLifespan : DefaultObjectLifeSpan; var success = await Db.StringSetAsync(key, value, timeout, When.NotExists); if (!success) throw new InvalidOperationException(String.Format("Could not insert object {0}", sharedObjectId)); }
public async Task UpdateAsync(SharedObjectId sharedObjectId, object sharedObject, TimeSpan objectTimeout = default(TimeSpan)) { CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var key = KeyOf(sharedObjectId); var value = await SerializeAsync(sharedObject); var timeout = objectTimeout; if (timeout == default(TimeSpan)) { var currentValueWithExpiry = Db.StringGetWithExpiry(key); if (currentValueWithExpiry.Expiry != null) timeout = currentValueWithExpiry.Expiry.Value; } var success = await Db.StringSetAsync(key, value, timeout, When.Exists); if (!success) throw new InvalidOperationException(String.Format("Could not update object {0}", sharedObjectId)); }
public async Task RemoveAsync(SharedObjectId sharedObjectId) { CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var key = KeyOf(sharedObjectId); var success = await Db.KeyDeleteAsync(key); if (!success) throw new InvalidOperationException(String.Format("Could not remove object {0}", sharedObjectId)); }
public object Read(Type objectType, SharedObjectId sharedObjectId) { CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var key = KeyOf(sharedObjectId); var valueWithExpire = Db.StringGetWithExpiry(key); if (IsObjectExpired(valueWithExpire)) return null; var sharedObject = Deserialize(valueWithExpire.Value, objectType); return sharedObject; }
private static FileBasedKey LockKeyFor(SharedObjectId sharedObjectId) { var key = (FileBasedKey)("LockFor" + sharedObjectId.Value); return key; }
public void Unlock(SharedObjectId sharedObjectId) { CheckObjectIsLocked(sharedObjectId); CheckObjectIsNotLockedBySomeoneElse(sharedObjectId); var lockKey = LockKeyFor(sharedObjectId); var lockValue = LockValueFor(sharedObjectId); // Remove the key representing the lock Db.KeyDelete(lockKey); Log.Info("Lock with key {0} and value {1} for shared object of id {2} RELEASED", lockKey, lockValue, sharedObjectId); }
public void Lock(SharedObjectId sharedObjectId, TimeSpan acquireTimeout, TimeSpan lockDuration = default(TimeSpan)) { var lockKey = LockKeyFor(sharedObjectId); var lockValue = LockValueFor(sharedObjectId); var lockAcquired = false; var sw = new Stopwatch(); sw.Start(); acquireTimeout = acquireTimeout != default(TimeSpan) ? acquireTimeout : DefaultAcquireLockTimeout; lockDuration = lockDuration != default(TimeSpan) ? lockDuration : DefaultLockDuration; while (!lockAcquired && sw.Elapsed < acquireTimeout) { // Returns true only if the string was set. It means, if there is no previous value with this key lockAcquired = Db.StringSet(lockKey, lockValue, lockDuration, When.NotExists); Thread.Sleep(10); lockAcquired = lockAcquired && lockValue == Db.StringGet(lockKey); } sw.Stop(); if (lockAcquired) { Log.Info("Lock with key {0} and value {1} for shared object of id {2} and duration {3} ACQUIRED!", lockKey, lockValue, sharedObjectId, lockDuration); } else { Log.Error("Lock with key {0} and value {1} for shared object of id {2} and duration {3} COULD NOT BE ACQUIRED!", lockKey, lockValue, sharedObjectId, lockDuration); throw new CouldNotAcquireLockException(sharedObjectId); } }
private RedisValue LockValueFor(SharedObjectId sharedObjectId) { return Serialize(sharedObjectId + "@" + RedisSharedMemoryId); }
private void CheckObjectIsNotLockedBySomeoneElse(SharedObjectId sharedObjectId) { var lockKey = LockKeyFor(sharedObjectId); var expectedLockValue = LockValueFor(sharedObjectId); var lockValue = Db.StringGet(lockKey); var isLockedBySomeoneElse = !lockValue.IsNull && lockValue != expectedLockValue; if (isLockedBySomeoneElse) throw new AccessLockedException(sharedObjectId); }
private void CheckObjectIsLocked(SharedObjectId sharedObjectId) { var isLocked = IsLocked(sharedObjectId); if (!isLocked) throw new AccessShouldBeLockedException(sharedObjectId); }
private FileBasedValue LockValueFor(SharedObjectId sharedObjectId) { return Serialize(sharedObjectId + "@" + FileBasedSharedMemoryId); }
private static RedisKey LockKeyFor(SharedObjectId sharedObjectId) { var key = (RedisKey)("LockFor" + sharedObjectId.Value); return key; }
public bool IsLocked(SharedObjectId sharedObjectId) { var lockKey = LockKeyFor(sharedObjectId); LockValueFor(sharedObjectId); var lockValue = Db.StringGet(lockKey); return !lockValue.IsNull; }
private static FileBasedKey KeyOf(SharedObjectId sharedObjectId) { var key = (FileBasedKey)sharedObjectId.Value; return key; }