private SessionStateItem Get(HttpContext context, bool acquireLock, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { locked = false; lockId = null; lockAge = TimeSpan.Zero; actions = SessionStateActions.None; var e = SessionStateItem.Load(this.client, id, false); if (e == null) { return(null); } if (acquireLock) { // repeat until we can update the retrieved // item (i.e. nobody changes it between the // time we get it from the store and updates its attributes) // Save() will return false if Cas() fails while (true) { if (e.LockId > 0) { break; } actions = e.Flag; e.LockId = e.HeadCas; e.LockTime = DateTime.UtcNow; e.Flag = SessionStateActions.None; // try to update the item in the store if (e.Save(this.client, id, true, true)) { locked = true; lockId = e.LockId; return(e); } // it has been modifed between we loaded and tried to save it e = SessionStateItem.Load(this.client, id, false); if (e == null) { return(null); } } } locked = true; lockAge = DateTime.UtcNow - e.LockTime; lockId = e.LockId; actions = SessionStateActions.None; return(acquireLock ? null : e); }
public override void ResetItemTimeout(HttpContext context, string id) { var e = SessionStateItem.Load(this.client, id, false); if (e != null) { e.Save(this.client, id, false, true); } }
public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item) { if (!(lockId is ulong)) { return; } var tmp = (ulong)lockId; var e = SessionStateItem.Load(this.client, id, true); if (e != null && e.LockId == tmp) { SessionStateItem.Remove(this.client, id); } }
public void Load_WhenNotSuccess_ReturnNull(ResponseStatus status) { //arrange var result = new Mock <IOperationResult <byte[]> >(); result.Setup(x => x.Status).Returns(status); var bucket = new Mock <IBucket>(); bucket.Setup(x => x.Get <byte[]>(It.IsAny <string>())).Returns(result.Object); //act var item = SessionStateItem.Load(bucket.Object, "thekey", false); //assert Assert.IsNull(item); }
public override void ReleaseItemExclusive(HttpContext context, string id, object lockId) { if (!(lockId is ulong)) { return; } var tmp = (ulong)lockId; var e = SessionStateItem.Load(this.client, id, true); if (e != null && e.LockId == tmp) { e.LockId = 0; e.LockTime = DateTime.MinValue; e.Save(this.client, id, true, true); } }
public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) { SessionStateItem e = null; bool existing = false; if (!newItem) { if (!(lockId is ulong)) { return; } var tmp = (ulong)lockId; e = SessionStateItem.Load(this.client, id, true); existing = e != null; // if we're expecting an existing item, but // it's not in the cache // or it's not locked // or it's locked by someone else, then quit if (!newItem && (!existing || e.LockId == 0 || e.LockId != tmp)) { return; } } if (!existing) { e = new SessionStateItem(); } // set the new data and reset the locks e.Timeout = item.Timeout; e.Data = (SessionStateItemCollection)item.Items; e.Flag = SessionStateActions.None; e.LockId = 0; e.LockTime = DateTime.MinValue; e.Save(this.client, id, false, existing && !newItem); }