From dbb2edf1a67442b5e41da3cd8010574114bba7c2 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 9 Mar 2010 17:09:44 -0800
Subject: Fixed caching of user accounts.

---
 .../LocalUserAccountServiceConnector.cs            | 15 ++++----
 .../RemoteUserAccountServiceConnector.cs           | 15 ++++----
 .../UserAccounts/UserAccountCache.cs               | 44 +++++++++++++---------
 .../UserAccounts/UserAccountServiceConnector.cs    |  1 +
 .../UserAccountService/UserAccountService.cs       |  2 +
 5 files changed, 45 insertions(+), 32 deletions(-)

diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
index 07fee79..ce0ca40 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
@@ -142,26 +142,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
 
         public UserAccount GetUserAccount(UUID scopeID, UUID userID)
         {
-            UserAccount account = m_Cache.Get(userID);
-            if (account != null)
+            bool inCache = false;
+            UserAccount account = m_Cache.Get(userID, out inCache);
+            if (inCache)
                 return account;
 
             account = m_UserService.GetUserAccount(scopeID, userID);
-            if (account != null)
-                m_Cache.Cache(account);
+            m_Cache.Cache(userID, account);
 
             return account;
         }
 
         public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
         {
-            UserAccount account = m_Cache.Get(firstName + " " + lastName);
-            if (account != null)
+            bool inCache = false;
+            UserAccount account = m_Cache.Get(firstName + " " + lastName, out inCache);
+            if (inCache)
                 return account;
 
             account = m_UserService.GetUserAccount(scopeID, firstName, lastName);
             if (account != null)
-                m_Cache.Cache(account);
+                m_Cache.Cache(account.PrincipalID, account);
 
             return account;
         }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
index 1140692..488dbd5 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
@@ -119,26 +119,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
 
         public override UserAccount GetUserAccount(UUID scopeID, UUID userID)
         {
-            UserAccount account = m_Cache.Get(userID);
-            if (account != null)
+            bool inCache = false;
+            UserAccount account = m_Cache.Get(userID, out inCache);
+            if (inCache)
                 return account;
 
             account = base.GetUserAccount(scopeID, userID);
-            if (account != null)
-                m_Cache.Cache(account);
+            m_Cache.Cache(userID, account);
 
             return account;
         }
 
         public override UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
         {
-            UserAccount account = m_Cache.Get(firstName + " " + lastName);
-            if (account != null)
+            bool inCache = false;
+            UserAccount account = m_Cache.Get(firstName + " " + lastName, out inCache);
+            if (inCache)
                 return account;
 
             account = base.GetUserAccount(scopeID, firstName, lastName);
             if (account != null)
-                m_Cache.Cache(account);
+                m_Cache.Cache(account.PrincipalID, account);
 
             return account;
         }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
index e430fc7..a355661 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
@@ -36,50 +36,58 @@ 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;
+        private static readonly ILog m_log =
+                LogManager.GetLogger(
+                MethodBase.GetCurrentMethod().DeclaringType);
+        private ExpiringCache<UUID, UserAccount> m_UUIDCache;
+        private ExpiringCache<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
+            m_UUIDCache = new ExpiringCache<UUID, UserAccount>();
+            m_NameCache = new ExpiringCache<string, UUID>(); // this one is unbound
         }
 
-        public void Cache(UserAccount account)
+        public void Cache(UUID userID, UserAccount account)
         {
-            m_UUIDCache.Set(account.PrincipalID, account, 512);
-            m_NameCache[account.Name] = account.PrincipalID;
+            // Cache even null accounts
+            m_UUIDCache.AddOrUpdate(userID, account, DateTime.Now + TimeSpan.FromMinutes(2.0d));
+            if (account != null)
+                m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, DateTime.Now + TimeSpan.FromMinutes(2.0d));
 
-            //m_log.DebugFormat("[USER CACHE]: cached user {0} {1}", account.FirstName, account.LastName);
+            m_log.DebugFormat("[USER CACHE]: cached user {0}", userID);
         }
 
-        public UserAccount Get(UUID userID)
+        public UserAccount Get(UUID userID, out bool inCache)
         {
             UserAccount account = null;
+            inCache = false;
             if (m_UUIDCache.TryGetValue(userID, out account))
             {
                 //m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
+                inCache = true;
                 return account;
             }
 
             return null;
         }
 
-        public UserAccount Get(string name)
+        public UserAccount Get(string name, out bool inCache)
         {
-            if (!m_NameCache.ContainsKey(name))
+            inCache = false;
+            if (!m_NameCache.Contains(name))
                 return null;
 
             UserAccount account = null;
-            if (m_UUIDCache.TryGetValue(m_NameCache[name], out account))
-                return account;
+            UUID uuid = UUID.Zero;
+            if (m_NameCache.TryGetValue(name, out uuid))
+                if (m_UUIDCache.TryGetValue(uuid, out account))
+                {
+                    inCache = true;
+                    return account;
+                }
 
             return null;
         }
diff --git a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs
index 8e7c92b..2f9b520 100644
--- a/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs
+++ b/OpenSim/Services/Connectors/UserAccounts/UserAccountServiceConnector.cs
@@ -113,6 +113,7 @@ namespace OpenSim.Services.Connectors
 
         public virtual UserAccount GetUserAccount(UUID scopeID, UUID userID)
         {
+            m_log.DebugFormat("[ACCOUNTS CONNECTOR]: GetUSerAccount {0}", userID);
             Dictionary<string, object> sendData = new Dictionary<string, object>();
             //sendData["SCOPEID"] = scopeID.ToString();
             sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString();
diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs
index 82c34e7..38caf74 100644
--- a/OpenSim/Services/UserAccountService/UserAccountService.cs
+++ b/OpenSim/Services/UserAccountService/UserAccountService.cs
@@ -200,7 +200,9 @@ namespace OpenSim.Services.UserAccountService
             }
 
             if (d.Length < 1)
+            {
                 return null;
+            }
 
             return MakeUserAccount(d[0]);
         }
-- 
cgit v1.1