Added a UserAccountCache to the UserAccountServiceConnectors. Uses a CenomeCache.

slimupdates
Diva Canto 2010-01-14 08:05:08 -08:00
parent 4bae547ecb
commit e9d376972f
4 changed files with 147 additions and 7 deletions

View File

@ -46,6 +46,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
MethodBase.GetCurrentMethod().DeclaringType); MethodBase.GetCurrentMethod().DeclaringType);
private IUserAccountService m_UserService; private IUserAccountService m_UserService;
private UserAccountCache m_Cache;
private bool m_Enabled = false; private bool m_Enabled = false;
@ -96,6 +97,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
return; return;
} }
m_Enabled = true; m_Enabled = true;
m_Cache = new UserAccountCache();
m_log.Info("[USER CONNECTOR]: Local user connector enabled"); m_log.Info("[USER CONNECTOR]: Local user connector enabled");
} }
} }
@ -139,12 +142,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
public UserAccount GetUserAccount(UUID scopeID, UUID userID) public UserAccount GetUserAccount(UUID scopeID, UUID userID)
{ {
return m_UserService.GetUserAccount(scopeID, userID); UserAccount account = m_Cache.Get(userID);
if (account != null)
return account;
account = m_UserService.GetUserAccount(scopeID, userID);
if (account != null)
m_Cache.Cache(account);
return account;
} }
public UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName) public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
{ {
return m_UserService.GetUserAccount(scopeID, FirstName, LastName); UserAccount account = m_Cache.Get(firstName + " " + lastName);
if (account != null)
return account;
account = m_UserService.GetUserAccount(scopeID, firstName, lastName);
if (account != null)
m_Cache.Cache(account);
return account;
} }
public UserAccount GetUserAccount(UUID scopeID, string Email) public UserAccount GetUserAccount(UUID scopeID, string Email)

View File

@ -34,6 +34,8 @@ using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
using OpenSim.Services.Connectors; using OpenSim.Services.Connectors;
using OpenMetaverse;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
{ {
public class RemoteUserAccountServicesConnector : UserAccountServicesConnector, public class RemoteUserAccountServicesConnector : UserAccountServicesConnector,
@ -44,6 +46,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
MethodBase.GetCurrentMethod().DeclaringType); MethodBase.GetCurrentMethod().DeclaringType);
private bool m_Enabled = false; private bool m_Enabled = false;
private UserAccountCache m_Cache;
public Type ReplaceableInterface public Type ReplaceableInterface
{ {
@ -73,6 +76,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
m_Enabled = true; m_Enabled = true;
base.Initialise(source); base.Initialise(source);
m_Cache = new UserAccountCache();
m_log.Info("[USER CONNECTOR]: Remote users enabled"); m_log.Info("[USER CONNECTOR]: Remote users enabled");
} }
@ -110,5 +114,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
if (!m_Enabled) if (!m_Enabled)
return; return;
} }
#region Overwritten methods from IUserAccountService
public override UserAccount GetUserAccount(UUID scopeID, UUID userID)
{
UserAccount account = m_Cache.Get(userID);
if (account != null)
return account;
account = base.GetUserAccount(scopeID, userID);
if (account != null)
m_Cache.Cache(account);
return account;
}
public override UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
{
UserAccount account = m_Cache.Get(firstName + " " + lastName);
if (account != null)
return account;
account = base.GetUserAccount(scopeID, firstName, lastName);
if (account != null)
m_Cache.Cache(account);
return account;
}
#endregion
} }
} }

View File

@ -0,0 +1,87 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Reflection;
using System.Collections.Generic;
using OpenSim.Framework;
using OpenSim.Services.Interfaces;
using OpenMetaverse;
using log4net;
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
{
public class UserAccountCache
{
//private static readonly ILog m_log =
// LogManager.GetLogger(
// MethodBase.GetCurrentMethod().DeclaringType);
private ICnmCache<UUID, UserAccount> m_UUIDCache;
private Dictionary<string, UUID> m_NameCache;
public UserAccountCache()
{
// Warning: the size values are a bit fuzzy. What matters
// most for this cache is the count value (128 entries).
m_UUIDCache = CnmSynchronizedCache<UUID, UserAccount>.Synchronized(new CnmMemoryCache<UUID, UserAccount>(
128, 128*512, TimeSpan.FromMinutes(30.0)));
m_NameCache = new Dictionary<string, UUID>(); // this one is unbound
}
public void Cache(UserAccount account)
{
m_UUIDCache.Set(account.PrincipalID, account, 512);
m_NameCache[account.Name] = account.PrincipalID;
//m_log.DebugFormat("[USER CACHE]: cached user {0} {1}", account.FirstName, account.LastName);
}
public UserAccount Get(UUID userID)
{
UserAccount account = null;
if (m_UUIDCache.TryGetValue(userID, out account))
{
//m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
return account;
}
return null;
}
public UserAccount Get(string name)
{
if (!m_NameCache.ContainsKey(name))
return null;
UserAccount account = null;
if (m_UUIDCache.TryGetValue(m_NameCache[name], out account))
return account;
return null;
}
}
}

View File

@ -82,7 +82,7 @@ namespace OpenSim.Services.Connectors
m_ServerURI = serviceURI; m_ServerURI = serviceURI;
} }
public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName) public virtual UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
{ {
Dictionary<string, object> sendData = new Dictionary<string, object>(); Dictionary<string, object> sendData = new Dictionary<string, object>();
//sendData["SCOPEID"] = scopeID.ToString(); //sendData["SCOPEID"] = scopeID.ToString();
@ -97,7 +97,7 @@ namespace OpenSim.Services.Connectors
return SendAndGetReply(sendData); return SendAndGetReply(sendData);
} }
public UserAccount GetUserAccount(UUID scopeID, string email) public virtual UserAccount GetUserAccount(UUID scopeID, string email)
{ {
Dictionary<string, object> sendData = new Dictionary<string, object>(); Dictionary<string, object> sendData = new Dictionary<string, object>();
//sendData["SCOPEID"] = scopeID.ToString(); //sendData["SCOPEID"] = scopeID.ToString();
@ -111,7 +111,7 @@ namespace OpenSim.Services.Connectors
return SendAndGetReply(sendData); return SendAndGetReply(sendData);
} }
public UserAccount GetUserAccount(UUID scopeID, UUID userID) public virtual UserAccount GetUserAccount(UUID scopeID, UUID userID)
{ {
Dictionary<string, object> sendData = new Dictionary<string, object>(); Dictionary<string, object> sendData = new Dictionary<string, object>();
//sendData["SCOPEID"] = scopeID.ToString(); //sendData["SCOPEID"] = scopeID.ToString();