aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs25
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs34
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs87
3 files changed, 143 insertions, 3 deletions
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
index f55de5a..07fee79 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs
@@ -46,6 +46,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
46 MethodBase.GetCurrentMethod().DeclaringType); 46 MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 private IUserAccountService m_UserService; 48 private IUserAccountService m_UserService;
49 private UserAccountCache m_Cache;
49 50
50 private bool m_Enabled = false; 51 private bool m_Enabled = false;
51 52
@@ -96,6 +97,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
96 return; 97 return;
97 } 98 }
98 m_Enabled = true; 99 m_Enabled = true;
100 m_Cache = new UserAccountCache();
101
99 m_log.Info("[USER CONNECTOR]: Local user connector enabled"); 102 m_log.Info("[USER CONNECTOR]: Local user connector enabled");
100 } 103 }
101 } 104 }
@@ -139,12 +142,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
139 142
140 public UserAccount GetUserAccount(UUID scopeID, UUID userID) 143 public UserAccount GetUserAccount(UUID scopeID, UUID userID)
141 { 144 {
142 return m_UserService.GetUserAccount(scopeID, userID); 145 UserAccount account = m_Cache.Get(userID);
146 if (account != null)
147 return account;
148
149 account = m_UserService.GetUserAccount(scopeID, userID);
150 if (account != null)
151 m_Cache.Cache(account);
152
153 return account;
143 } 154 }
144 155
145 public UserAccount GetUserAccount(UUID scopeID, string FirstName, string LastName) 156 public UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
146 { 157 {
147 return m_UserService.GetUserAccount(scopeID, FirstName, LastName); 158 UserAccount account = m_Cache.Get(firstName + " " + lastName);
159 if (account != null)
160 return account;
161
162 account = m_UserService.GetUserAccount(scopeID, firstName, lastName);
163 if (account != null)
164 m_Cache.Cache(account);
165
166 return account;
148 } 167 }
149 168
150 public UserAccount GetUserAccount(UUID scopeID, string Email) 169 public UserAccount GetUserAccount(UUID scopeID, string Email)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
index 7d61b20..13acdf2 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/RemoteUserAccountServiceConnector.cs
@@ -34,6 +34,8 @@ using OpenSim.Region.Framework.Scenes;
34using OpenSim.Services.Interfaces; 34using OpenSim.Services.Interfaces;
35using OpenSim.Services.Connectors; 35using OpenSim.Services.Connectors;
36 36
37using OpenMetaverse;
38
37namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts 39namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
38{ 40{
39 public class RemoteUserAccountServicesConnector : UserAccountServicesConnector, 41 public class RemoteUserAccountServicesConnector : UserAccountServicesConnector,
@@ -44,6 +46,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
44 MethodBase.GetCurrentMethod().DeclaringType); 46 MethodBase.GetCurrentMethod().DeclaringType);
45 47
46 private bool m_Enabled = false; 48 private bool m_Enabled = false;
49 private UserAccountCache m_Cache;
47 50
48 public Type ReplaceableInterface 51 public Type ReplaceableInterface
49 { 52 {
@@ -73,6 +76,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
73 m_Enabled = true; 76 m_Enabled = true;
74 77
75 base.Initialise(source); 78 base.Initialise(source);
79 m_Cache = new UserAccountCache();
76 80
77 m_log.Info("[USER CONNECTOR]: Remote users enabled"); 81 m_log.Info("[USER CONNECTOR]: Remote users enabled");
78 } 82 }
@@ -110,5 +114,35 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
110 if (!m_Enabled) 114 if (!m_Enabled)
111 return; 115 return;
112 } 116 }
117
118 #region Overwritten methods from IUserAccountService
119
120 public override UserAccount GetUserAccount(UUID scopeID, UUID userID)
121 {
122 UserAccount account = m_Cache.Get(userID);
123 if (account != null)
124 return account;
125
126 account = base.GetUserAccount(scopeID, userID);
127 if (account != null)
128 m_Cache.Cache(account);
129
130 return account;
131 }
132
133 public override UserAccount GetUserAccount(UUID scopeID, string firstName, string lastName)
134 {
135 UserAccount account = m_Cache.Get(firstName + " " + lastName);
136 if (account != null)
137 return account;
138
139 account = base.GetUserAccount(scopeID, firstName, lastName);
140 if (account != null)
141 m_Cache.Cache(account);
142
143 return account;
144 }
145
146 #endregion
113 } 147 }
114} 148}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
new file mode 100644
index 0000000..e430fc7
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs
@@ -0,0 +1,87 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27using System;
28using System.Reflection;
29using System.Collections.Generic;
30using OpenSim.Framework;
31using OpenSim.Services.Interfaces;
32using OpenMetaverse;
33using log4net;
34
35namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts
36{
37 public class UserAccountCache
38 {
39 //private static readonly ILog m_log =
40 // LogManager.GetLogger(
41 // MethodBase.GetCurrentMethod().DeclaringType);
42
43 private ICnmCache<UUID, UserAccount> m_UUIDCache;
44 private Dictionary<string, UUID> m_NameCache;
45
46 public UserAccountCache()
47 {
48 // Warning: the size values are a bit fuzzy. What matters
49 // most for this cache is the count value (128 entries).
50 m_UUIDCache = CnmSynchronizedCache<UUID, UserAccount>.Synchronized(new CnmMemoryCache<UUID, UserAccount>(
51 128, 128*512, TimeSpan.FromMinutes(30.0)));
52 m_NameCache = new Dictionary<string, UUID>(); // this one is unbound
53 }
54
55 public void Cache(UserAccount account)
56 {
57 m_UUIDCache.Set(account.PrincipalID, account, 512);
58 m_NameCache[account.Name] = account.PrincipalID;
59
60 //m_log.DebugFormat("[USER CACHE]: cached user {0} {1}", account.FirstName, account.LastName);
61 }
62
63 public UserAccount Get(UUID userID)
64 {
65 UserAccount account = null;
66 if (m_UUIDCache.TryGetValue(userID, out account))
67 {
68 //m_log.DebugFormat("[USER CACHE]: Account {0} {1} found in cache", account.FirstName, account.LastName);
69 return account;
70 }
71
72 return null;
73 }
74
75 public UserAccount Get(string name)
76 {
77 if (!m_NameCache.ContainsKey(name))
78 return null;
79
80 UserAccount account = null;
81 if (m_UUIDCache.TryGetValue(m_NameCache[name], out account))
82 return account;
83
84 return null;
85 }
86 }
87}