aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs')
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs103
1 files changed, 77 insertions, 26 deletions
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
index ed52e48..f3572a2 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
@@ -34,68 +34,119 @@ using log4net;
34 34
35namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts 35namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
36{ 36{
37 public class UserAccountCache 37 public class UserAccountCache : IUserAccountCacheModule
38 { 38 {
39 private const double CACHE_EXPIRATION_SECONDS = 120000.0; // 33 hours! 39 private const double CACHE_ALIEN_EXPIRATION_SECONDS = 172800; // 48 hours
40 private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour!
41 private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes
40 42
41// private static readonly ILog m_log = 43// private static readonly ILog m_log =
42// LogManager.GetLogger( 44// LogManager.GetLogger(
43// MethodBase.GetCurrentMethod().DeclaringType); 45// MethodBase.GetCurrentMethod().DeclaringType);
44 46
45 private ExpiringCache<UUID, UserAccount> m_UUIDCache; 47 private ExpiringCache<UUID, UserAccount> m_UUIDCache;
46 private ExpiringCache<string, UUID> m_NameCache; 48 private ExpiringCache<string, UUID> m_NameCache;
49 private object accessLock = new object();
47 50
48 public UserAccountCache() 51 public UserAccountCache()
49 { 52 {
50 m_UUIDCache = new ExpiringCache<UUID, UserAccount>(); 53 m_UUIDCache = new ExpiringCache<UUID, UserAccount>();
51 m_NameCache = new ExpiringCache<string, UUID>(); 54 m_NameCache = new ExpiringCache<string, UUID>();
52 } 55 }
53 56
54 public void Cache(UUID userID, UserAccount account) 57 public void Cache(UUID userID, UserAccount account)
55 { 58 {
56 // Cache even null accounts 59 // Cache even null accounts
57 m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS); 60 lock(accessLock)
58 if (account != null) 61 {
59 m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS); 62 if (account == null)
60 63 m_UUIDCache.AddOrUpdate(userID, null, CACHE_NULL_EXPIRATION_SECONDS);
64 else if(account.LocalToGrid)
65 {
66 m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS);
67 m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS);
68 }
69 else
70 {
71 m_UUIDCache.AddOrUpdate(userID, account, CACHE_ALIEN_EXPIRATION_SECONDS);
72 m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_ALIEN_EXPIRATION_SECONDS);
73 }
61 //m_log.DebugFormat("[USER CACHE]: cached user {0}", userID); 74 //m_log.DebugFormat("[USER CACHE]: cached user {0}", userID);
75 }
62 } 76 }
63 77
64 public void Invalidate(UUID userID)
65 {
66 m_UUIDCache.Remove(userID);
67 }
68 78
69 public UserAccount Get(UUID userID, out bool inCache) 79 public UserAccount Get(UUID userID, out bool inCache)
70 { 80 {
71 UserAccount account = null; 81 UserAccount account = null;
72 inCache = false; 82 inCache = false;
73 if (m_UUIDCache.TryGetValue(userID, out account)) 83 lock(accessLock)
74 { 84 {
75 //m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName); 85 if (m_UUIDCache.TryGetValue(userID, out account))
76 inCache = true; 86 {
77 return account; 87 //m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
88 inCache = true;
89 return account;
90 }
78 } 91 }
79
80 return null; 92 return null;
81 } 93 }
82 94
83 public UserAccount Get(string name, out bool inCache) 95 public UserAccount Get(string name, out bool inCache)
84 { 96 {
85 inCache = false; 97 inCache = false;
86 if (!m_NameCache.Contains(name)) 98 lock(accessLock)
87 return null; 99 {
100 if (!m_NameCache.Contains(name))
101 return null;
88 102
89 UserAccount account = null; 103 UserAccount account = null;
90 UUID uuid = UUID.Zero; 104 UUID uuid = UUID.Zero;
91 if (m_NameCache.TryGetValue(name, out uuid)) 105 if (m_NameCache.TryGetValue(name, out uuid))
92 if (m_UUIDCache.TryGetValue(uuid, out account))
93 { 106 {
94 inCache = true; 107 if (m_UUIDCache.TryGetValue(uuid, out account))
95 return account; 108 {
109 inCache = true;
110 return account;
111 }
96 } 112 }
97 113 }
98 return null; 114 return null;
99 } 115 }
116
117 public void Invalidate(UUID userID)
118 {
119 m_UUIDCache.Remove(userID);
120 }
121
122 public void Remove(UUID id)
123 {
124 lock(accessLock)
125 {
126 if (!m_UUIDCache.Contains(id))
127 return;
128
129 UserAccount account = null;
130 if (m_UUIDCache.TryGetValue(id, out account) && account != null)
131 m_NameCache.Remove(account.Name);
132 m_UUIDCache.Remove(id);
133 }
134 }
135
136 public void Remove(string name)
137 {
138 lock(accessLock)
139 {
140 if (!m_NameCache.Contains(name))
141 return;
142
143 UUID uuid = UUID.Zero;
144 if (m_NameCache.TryGetValue(name, out uuid))
145 {
146 m_NameCache.Remove(name);
147 m_UUIDCache.Remove(uuid);
148 }
149 }
150 }
100 } 151 }
101} 152}