You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2016/11/10 17:35:25 UTC
ignite git commit: IGNITE-4186 .NET: Fix "Invalid session release
request" exception in
IgniteSessionStateStoreProvider.SetAndReleaseItemExclusive
Repository: ignite
Updated Branches:
refs/heads/master aacdcba6a -> e007f6e35
IGNITE-4186 .NET: Fix "Invalid session release request" exception in IgniteSessionStateStoreProvider.SetAndReleaseItemExclusive
This closes #1227
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e007f6e3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e007f6e3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e007f6e3
Branch: refs/heads/master
Commit: e007f6e35efc2e0cdab94e39510b2dbd77c6e454
Parents: aacdcba
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Thu Nov 10 20:35:15 2016 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Thu Nov 10 20:35:15 2016 +0300
----------------------------------------------------------------------
.../IgniteSessionStateStoreProviderTest.cs | 49 +++++++++++++++++---
.../IgniteSessionStateStoreProvider.cs | 21 ++++++---
2 files changed, 57 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e007f6e3/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/IgniteSessionStateStoreProviderTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/IgniteSessionStateStoreProviderTest.cs b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/IgniteSessionStateStoreProviderTest.cs
index 9c3b07c..c6e3b30 100644
--- a/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/IgniteSessionStateStoreProviderTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.AspNet.Tests/IgniteSessionStateStoreProviderTest.cs
@@ -209,6 +209,24 @@ namespace Apache.Ignite.AspNet.Tests
Assert.AreEqual(TimeSpan.Zero, lockAge);
Assert.AreEqual(SessionStateActions.None, actions);
+ // SetAndRelease with no lock. This happens with certain versions of ASP.NET.
+ var item = provider.CreateNewStoreData(HttpContext, 7);
+ // ReSharper disable once AssignNullToNotNullAttribute (lockId is not supposed to be null, but it can be).
+ provider.SetAndReleaseItemExclusive(HttpContext, Id, item, null, true);
+
+ // Check added item.
+ res = provider.GetItem(HttpContext, Id, out locked, out lockAge, out lockId, out actions);
+ Assert.IsNotNull(res);
+ Assert.IsNull(lockId);
+ Assert.AreEqual(7, res.Timeout);
+ Assert.IsFalse(locked);
+ Assert.AreEqual(TimeSpan.Zero, lockAge);
+ Assert.AreEqual(SessionStateActions.None, actions);
+
+ // Remove item.
+ // ReSharper disable once AssignNullToNotNullAttribute (lockId is not supposed to be null, but it can be).
+ provider.RemoveItem(HttpContext, Id, null, null);
+
// Add item.
provider.CreateUninitializedItem(HttpContext, Id, 7);
@@ -228,7 +246,7 @@ namespace Apache.Ignite.AspNet.Tests
Assert.IsFalse(locked);
Assert.AreEqual(TimeSpan.Zero, lockAge);
Assert.AreEqual(SessionStateActions.None, actions);
- provider.SetAndReleaseItemExclusive(HttpContext, Id, UpdateStoreData(res), lockId, true);
+ provider.SetAndReleaseItemExclusive(HttpContext, Id, UpdateStoreData(res), lockId, false);
// Not locked, item present.
res = provider.GetItem(HttpContext, Id, out locked, out lockAge, out lockId, out actions);
@@ -331,20 +349,37 @@ namespace Apache.Ignite.AspNet.Tests
Assert.IsFalse(GetProvider().SetItemExpireCallback(null));
// Check there is no item.
- var res = provider.GetItem(HttpContext, "myId", out locked, out lockAge, out lockId, out actions);
+ var res = provider.GetItem(HttpContext, Id, out locked, out lockAge, out lockId, out actions);
Assert.IsNull(res);
- // Put an item.
- provider.CreateUninitializedItem(HttpContext, "myId", 1);
+ // Put an item with CreateUninitializedItem and check.
+ provider.CreateUninitializedItem(HttpContext, Id, 1);
+ CheckExpiry(provider);
+
+ // Put an item with SetAndReleaseItemExclusive and check.
+ var data = provider.CreateNewStoreData(HttpContext, 1);
+ provider.SetAndReleaseItemExclusive(HttpContext, Id, data, lockId, true);
+ CheckExpiry(provider);
+ }
- // Check that it is there.
- res = provider.GetItem(HttpContext, "myId", out locked, out lockAge, out lockId, out actions);
+ /// <summary>
+ /// Checks item expiration.
+ /// </summary>
+ private static void CheckExpiry(SessionStateStoreProviderBase provider)
+ {
+ bool locked;
+ TimeSpan lockAge;
+ object lockId;
+ SessionStateActions actions;
+
+ // Check that item is present.
+ var res = provider.GetItem(HttpContext, Id, out locked, out lockAge, out lockId, out actions);
Assert.IsNotNull(res);
// Wait a minute and check again.
Thread.Sleep(TimeSpan.FromMinutes(1.05));
- res = provider.GetItem(HttpContext, "myId", out locked, out lockAge, out lockId, out actions);
+ res = provider.GetItem(HttpContext, Id, out locked, out lockAge, out lockId, out actions);
Assert.IsNull(res);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/e007f6e3/modules/platforms/dotnet/Apache.Ignite.AspNet/IgniteSessionStateStoreProvider.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.AspNet/IgniteSessionStateStoreProvider.cs b/modules/platforms/dotnet/Apache.Ignite.AspNet/IgniteSessionStateStoreProvider.cs
index 86035dd..a5e8199 100644
--- a/modules/platforms/dotnet/Apache.Ignite.AspNet/IgniteSessionStateStoreProvider.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.AspNet/IgniteSessionStateStoreProvider.cs
@@ -294,11 +294,20 @@ namespace Apache.Ignite.AspNet
var data = (IgniteSessionStateStoreData) item;
- if (!(lockId is long) || data.LockId != (long) lockId)
- throw new IgniteException(string.Format(CultureInfo.InvariantCulture,
- "Invalid session release request, expected lockId: {0}, actual: {1}", data.LockId, lockId));
+ if (newItem)
+ {
+ var cache = _expiryCacheHolder.GetCacheWithExpiry(data.Timeout * 60);
+
+ PutItem(key, data, cache);
+ }
+ else
+ {
+ if (!(lockId is long) || data.LockId != (long) lockId)
+ throw new IgniteException(string.Format(CultureInfo.InvariantCulture,
+ "Invalid session release request, expected lockId: {0}, actual: {1}", data.LockId, lockId));
- SetAndUnlockItem(key, data);
+ SetAndUnlockItem(key, data);
+ }
}
/// <summary>
@@ -333,7 +342,7 @@ namespace Apache.Ignite.AspNet
/// </summary>
/// <param name="context">The <see cref="T:System.Web.HttpContext" /> for the current request.</param>
/// <param name="timeout">The session-state <see cref="P:System.Web.SessionState.HttpSessionState.Timeout" />
- /// value for the new <see cref="T:System.Web.SessionState.SessionStateStoreData" />.</param>
+ /// value for the new <see cref="T:System.Web.SessionState.SessionStateStoreData" />, in minutes.</param>
/// <returns>
/// A new <see cref="T:System.Web.SessionState.SessionStateStoreData" /> for the current request.
/// </returns>
@@ -349,7 +358,7 @@ namespace Apache.Ignite.AspNet
/// <param name="id">The <see cref="P:System.Web.SessionState.HttpSessionState.SessionID" />
/// for the current request.</param>
/// <param name="timeout">The session <see cref="P:System.Web.SessionState.HttpSessionState.Timeout" />
- /// for the current request.</param>
+ /// for the current request, in minutes.</param>
public override void CreateUninitializedItem(HttpContext context, string id, int timeout)
{
var cache = _expiryCacheHolder.GetCacheWithExpiry((long) timeout * 60);