diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs | 103 |
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 | ||
35 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts | 35 | namespace 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 | } |