Skip to content
This repository has been archived by the owner on Dec 30, 2020. It is now read-only.

Commit

Permalink
fixed some remaining bugs in the Provider and changed a few more thin…
Browse files Browse the repository at this point in the history
…gs around
  • Loading branch information
Sedward committed May 25, 2010
1 parent 4761795 commit 01fbf24
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 59 deletions.
64 changes: 33 additions & 31 deletions MongoSessionStore/MongoSessionStoreProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace MongoSessionStore
{
public sealed class MongoSessionStoreProvider : SessionStateStoreProviderBase
{
private SessionStateSection sessionStateSection = null;
private SessionStateSection sessionStateSection = null;
private string eventSource = "MongoSessionStore";
private string eventLog = "Application";

Expand Down Expand Up @@ -69,31 +69,31 @@ public override void Dispose()
}

public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback)
{
{
return false;
}

public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem)
{
try
var sessionStore = SessionStore.Instance;
try
{

byte[] serializedItems = Serialize((SessionStateItemCollection)item.Items);
Binary sessionItems = new Binary(serializedItems);
var sessionStore = SessionStore.Instance;

if (newItem)
{
// Delete an existing expired session if it exists.
sessionStore.EvictExpiredSession(id, _applicationName);

// insert new session item.
Session session = new Session(id, this._applicationName, item.Timeout, sessionItems, item.Items.Count,0);
Session session = new Session(id, this._applicationName, item.Timeout, sessionItems, item.Items.Count, 0);
sessionStore.Insert(session);
}
else
{
SessionStore.UpdateSession(id, item.Timeout, sessionItems, this._applicationName, item.Items.Count, lockId);
sessionStore.UpdateSession(id, item.Timeout, sessionItems, this._applicationName, item.Items.Count, lockId);
}
}
catch (Exception e)
Expand Down Expand Up @@ -137,12 +137,12 @@ public override SessionStateStoreData GetItemExclusive(HttpContext context,
// is true (in the case of GetItemExclusive), then GetSessionStoreItem
// locks the record and sets a new LockId and LockDate.
//
private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
HttpContext context,
string id,
out bool locked,
private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
HttpContext context,
string id,
out bool locked,
out TimeSpan lockAge,
out object lockId,
out object lockId,
out SessionStateActions actionFlags)
{
// Initial values for return value and out parameters.
Expand All @@ -156,10 +156,10 @@ private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
byte[] serializedItems = new byte[0];
// Timeout value from the data store.
int timeout = 0;

var sessionStore = SessionStore.Instance;
try
{
Session session = SessionStore.Get(id, this._applicationName);
Session session = sessionStore.Get(id, this._applicationName);
// lockRecord is true when called from GetItemExclusive and
// false when called from GetItem.
// Obtain a lock if possible. Evict the record if it is expired.
Expand All @@ -168,7 +168,7 @@ private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
// Not found. The locked value is false.
locked = false;
}
else if(session.Expires < DateTime.Now)
else if (session.Expires < DateTime.Now)
{
locked = false;
SessionStore.Instance.EvictSession(session);
Expand All @@ -185,29 +185,29 @@ private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
locked = false;
lockId = session.LockID;
actionFlags = (SessionStateActions)session.Flags;


if (lockRecord)
{
lockId = (int)lockId + 1;
session.LockID = lockId;
session.Flags = 0;
SessionStore.LockSession(session);
session.Flags = 0;
sessionStore.LockSession(session);
}

if (actionFlags == SessionStateActions.InitializeItem)
item = CreateNewStoreData(context, sessionStateSection.Timeout.Minutes);
else
item = Deserialize(context, session.SessionItems.Bytes, session.Timeout);
}
}

}
catch (Exception e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "GetSessionStoreItem");
throw new ProviderException(e.Message,e.InnerException);
throw new ProviderException(e.Message, e.InnerException);
}
else
throw e;
Expand Down Expand Up @@ -277,16 +277,17 @@ private SessionStateStoreData Deserialize(HttpContext context, byte[] serialized
//
public override void ReleaseItemExclusive(HttpContext context, string id, object lockId)
{
var sessionStore = SessionStore.Instance;
try
{
SessionStore.ReleaseLock(id, this._applicationName, lockId, sessionStateSection.Timeout.TotalMinutes);
sessionStore.ReleaseLock(id, this._applicationName, lockId, sessionStateSection.Timeout.TotalMinutes);
}
catch (Exception e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "ReleaseItemExclusive");
throw new ProviderException(e.Message,e.InnerException);
throw new ProviderException(e.Message, e.InnerException);
}
else
throw e;
Expand All @@ -311,18 +312,18 @@ public override void RemoveItem(HttpContext context, string id, object lockId, S
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "RemoveItem");
throw new ProviderException(e.Message,e.InnerException);
throw new ProviderException(e.Message, e.InnerException);
}
else
throw e;
}
}
}

public override void CreateUninitializedItem(HttpContext context,string id,int timeout)
public override void CreateUninitializedItem(HttpContext context, string id, int timeout)
{
byte[] serializedItems = new byte[0];
Binary sessionItems = new Binary(serializedItems);
Session session = new Session(id,this._applicationName, timeout, sessionItems, 0, SessionStateActions.InitializeItem);
Session session = new Session(id, this._applicationName, timeout, sessionItems, 0, SessionStateActions.InitializeItem);

try
{
Expand All @@ -333,30 +334,31 @@ public override void CreateUninitializedItem(HttpContext context,string id,int t
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "CreateUninitializedItem");
throw new ProviderException(e.Message,e.InnerException);
throw new ProviderException(e.Message, e.InnerException);
}
else
throw e;
}
}

public override SessionStateStoreData CreateNewStoreData(HttpContext context,int timeout)
public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
{
return new SessionStateStoreData(new SessionStateItemCollection(),SessionStateUtility.GetSessionStaticObjects(context),timeout);
return new SessionStateStoreData(new SessionStateItemCollection(), SessionStateUtility.GetSessionStaticObjects(context), timeout);
}

public override void ResetItemTimeout(HttpContext context, string id)
{
var sessionStore = SessionStore.Instance;
try
{
SessionStore.UpdateSessionExpiration(id,this._applicationName, sessionStateSection.Timeout.TotalMinutes);
sessionStore.UpdateSessionExpiration(id, this._applicationName, sessionStateSection.Timeout.TotalMinutes);
}
catch (Exception e)
{
if (WriteExceptionsToEventLog)
{
WriteToEventLog(e, "ResetItemTimeout");
throw new ProviderException(e.Message,e.InnerException);
throw new ProviderException(e.Message, e.InnerException);
}
else
throw e;
Expand Down
10 changes: 5 additions & 5 deletions MongoSessionStore/SessionStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public void Insert(Session session)

}

public static Session Get(string id, string applicationName)
public Session Get(string id, string applicationName)
{
Document selector = new Document() { { "SessionId", id }, { "ApplicationName", applicationName } };
Session session;
Expand Down Expand Up @@ -92,7 +92,7 @@ public static Session Get(string id, string applicationName)
return session;
}

public static void UpdateSession(string id, int timeout, Binary sessionItems, string applicationName, int sessionItemsCount, object lockId)
public void UpdateSession(string id, int timeout, Binary sessionItems, string applicationName, int sessionItemsCount, object lockId)
{
try
{
Expand All @@ -112,7 +112,7 @@ public static void UpdateSession(string id, int timeout, Binary sessionItems, st

}

public static void UpdateSessionExpiration(string id, string applicationName, double timeout)
public void UpdateSessionExpiration(string id, string applicationName, double timeout)
{
try
{
Expand Down Expand Up @@ -183,7 +183,7 @@ public void EvictExpiredSession(string id, string applicationName)
}
}

public static void LockSession(Session session)
public void LockSession(Session session)
{
Document selector = new Document() { { "SessionId", session.SessionID }, { "ApplicationName", session.ApplicationName } };
Document sessionLock = new Document() { { "$set", new Document() {{"LockDate", DateTime.Now },
Expand All @@ -203,7 +203,7 @@ public static void LockSession(Session session)

}

public static void ReleaseLock(string id, string applicationName, object lockId, double timeout)
public void ReleaseLock(string id, string applicationName, object lockId, double timeout)
{
Document selector = new Document() { { "SessionId", id }, { "ApplicationName", applicationName }, { "LockId", lockId } };
Document sessionLock = new Document() { { "$set", new Document() { { "Expires", DateTime.Now.AddMinutes(timeout) }, { "Locked", false } } } };
Expand Down
2 changes: 1 addition & 1 deletion MongoSessionTest/Web.config
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
</sectionGroup>
</configSections>
<appSettings>
<add key="mongoserver" value="Server=localhost:27017;MaximumPoolSize=1;MinimumPoolSize=1;ConnectionTimeout=60;ConnectionLifetime=50"/>
<add key="mongoserver" value="Server=localhost:27017"/>
</appSettings>
<connectionStrings/>
<system.web>
Expand Down
14 changes: 11 additions & 3 deletions MongoStoreInspector/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ static void InspectSessions()

using (var mongo = new Mongo(config))
{

mongo.Connect();
ICursor allSessions = mongo["session_store"]["sessions"].FindAll();
foreach (Document session in allSessions.Documents)
{
Expand All @@ -59,8 +59,14 @@ static void InspectSessions()
int sessionItemsCount = (int)session["SessionItemsCount"];
int timeout = (int)session["Timeout"];
bool locked = (bool)session["Locked"];
string dump = "SessionId:" + id + " | Created:" + created.ToString() + " | Expires:" + expires.ToString() + " | Timeout:" + timeout.ToString();
dump += " | Locked?: " + locked.ToString() + " | Application:" + applicationName + " | Total Items:" + sessionItemsCount.ToString();
string dump = "SessionId:" + id +
"\nCreated:" + created.ToString() +
"\nExpires:" + expires.ToString() +
"\nTimeout:" + timeout.ToString();
dump +=
"\nLocked?: " + locked.ToString() +
"\nApplication:" + applicationName +
"\nTotal Items:" + sessionItemsCount.ToString();
Console.WriteLine(dump);
}
}
Expand All @@ -79,6 +85,7 @@ static void FlushExpiredSession()
{
using (var mongo = new Mongo(config))
{
mongo.Connect();
Document expiredSelector = new Document() { { "Expires", new Document() { { "$lt", DateTime.Now } } } };
mongo["session_store"]["sessions"].Delete(expiredSelector);
}
Expand All @@ -97,6 +104,7 @@ static void AddIndexes()
{
using (var mongo = new Mongo(config))
{
mongo.Connect();
Document index_spec = new Document() { { "SessionId", 1 }, { "ApplicationName", 1 } };
mongo["session_store"]["sessions"].MetaData.CreateIndex(index_spec, false);
}
Expand Down
7 changes: 5 additions & 2 deletions SessionStoreTest/App.config
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Mongo" type="MongoDB.Driver.Configuration.MongoConfiguration, MongoDB.Driver" />
<section name="Mongo" type="MongoDB.Configuration.MongoConfigurationSection, MongoDB" />
</configSections>
<Mongo>
<connections>
<add key="mongoserver" connectionString="Server=localhost:27017"/>
<add key="mongoserver" value="Server=localhost:27017" />
</connections>
</Mongo>
<appSettings>
<add key="mongoserver" value="Server=localhost:27017"/>
</appSettings>
</configuration>
19 changes: 11 additions & 8 deletions SessionStoreTest/ConnectionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ public void TestInserts()
Session session = new Session(id, "AppName", 2, b, items.Count, SessionStateActions.None);
using (var mongo = new Mongo(config))
{
SessionStore.Instance.Insert(session);
var sessionStore = SessionStore.Instance;
sessionStore.Insert(session);
i++;
}

Expand All @@ -57,17 +58,19 @@ public void TestUpdates()
ICursor allSessions;
using (var mongo = new Mongo(config))
{
mongo.Connect();
allSessions = mongo["session_store"]["sessions"].FindAll();
}
foreach (Document session in allSessions.Documents)
{
string id = (string)session["SessionId"];
ids.Add(id);
foreach (Document session in allSessions.Documents)
{
string id = (string)session["SessionId"];
ids.Add(id);

}
}
}
foreach (string s in ids)
{
SessionStore.UpdateSession(s, 2, b, "AppName", items.Count, 0);
var sessionStore = SessionStore.Instance;
sessionStore.UpdateSession(s, 2, b, "AppName", items.Count, 0);
}

}
Expand Down
Loading

0 comments on commit 01fbf24

Please sign in to comment.