aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorMic Bowman2011-06-15 11:22:51 -0700
committerMic Bowman2011-06-15 11:22:51 -0700
commit7a4fbdac7c18415d442f6af0b75fe8fcdc2eb509 (patch)
tree32adde486c6c77060d25a36c929b116fa8fe5743 /OpenSim/Region
parenttweak messages. Make verbose inventory item save message give the item name ... (diff)
downloadopensim-SC-7a4fbdac7c18415d442f6af0b75fe8fcdc2eb509.zip
opensim-SC-7a4fbdac7c18415d442f6af0b75fe8fcdc2eb509.tar.gz
opensim-SC-7a4fbdac7c18415d442f6af0b75fe8fcdc2eb509.tar.bz2
opensim-SC-7a4fbdac7c18415d442f6af0b75fe8fcdc2eb509.tar.xz
Added an expiring cache for region information to the
RemoteGridService connector. Timeout is currently set at five minutes. Negative results are not cached. The result is that operations like send an instant message do not have to go through the grid service every time.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs137
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs34
2 files changed, 169 insertions, 2 deletions
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs
new file mode 100644
index 0000000..786e0b5
--- /dev/null
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RegionInfoCache.cs
@@ -0,0 +1,137 @@
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;
34using GridRegion = OpenSim.Services.Interfaces.GridRegion;
35
36namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
37{
38 public class RegionInfoCache
39 {
40 private const double CACHE_EXPIRATION_SECONDS = 300.0; // 5 minutes
41
42// private static readonly ILog m_log =
43// LogManager.GetLogger(
44// MethodBase.GetCurrentMethod().DeclaringType);
45
46 internal struct ScopedRegionUUID
47 {
48 public UUID m_scopeID;
49 public UUID m_regionID;
50 public ScopedRegionUUID(UUID scopeID, UUID regionID)
51 {
52 m_scopeID = scopeID;
53 m_regionID = regionID;
54 }
55 }
56
57 internal struct ScopedRegionName
58 {
59 public UUID m_scopeID;
60 public string m_name;
61 public ScopedRegionName(UUID scopeID, string name)
62 {
63 m_scopeID = scopeID;
64 m_name = name;
65 }
66 }
67
68 private ExpiringCache<ScopedRegionUUID, GridRegion> m_UUIDCache;
69 private ExpiringCache<ScopedRegionName, ScopedRegionUUID> m_NameCache;
70
71 public RegionInfoCache()
72 {
73 m_UUIDCache = new ExpiringCache<ScopedRegionUUID, GridRegion>();
74 m_NameCache = new ExpiringCache<ScopedRegionName, ScopedRegionUUID>();
75 }
76
77 public void Cache(GridRegion rinfo)
78 {
79 if (rinfo != null)
80 this.Cache(rinfo.ScopeID,rinfo.RegionID,rinfo);
81 }
82
83 public void Cache(UUID scopeID, UUID regionID, GridRegion rinfo)
84 {
85 // for now, do not cache negative results; this is because
86 // we need to figure out how to handle regions coming online
87 // in a timely way
88 if (rinfo == null)
89 return;
90
91 ScopedRegionUUID id = new ScopedRegionUUID(scopeID,regionID);
92
93 // Cache even null accounts
94 m_UUIDCache.AddOrUpdate(id, rinfo, CACHE_EXPIRATION_SECONDS);
95 if (rinfo != null)
96 {
97 ScopedRegionName name = new ScopedRegionName(scopeID,rinfo.RegionName);
98 m_NameCache.AddOrUpdate(name, id, CACHE_EXPIRATION_SECONDS);
99 }
100 }
101
102 public GridRegion Get(UUID scopeID, UUID regionID, out bool inCache)
103 {
104 inCache = false;
105
106 GridRegion rinfo = null;
107 ScopedRegionUUID id = new ScopedRegionUUID(scopeID,regionID);
108 if (m_UUIDCache.TryGetValue(id, out rinfo))
109 {
110 inCache = true;
111 return rinfo;
112 }
113
114 return null;
115 }
116
117 public GridRegion Get(UUID scopeID, string name, out bool inCache)
118 {
119 inCache = false;
120
121 ScopedRegionName sname = new ScopedRegionName(scopeID,name);
122
123 ScopedRegionUUID id;
124 if (m_NameCache.TryGetValue(sname, out id))
125 {
126 GridRegion rinfo = null;
127 if (m_UUIDCache.TryGetValue(id, out rinfo))
128 {
129 inCache = true;
130 return rinfo;
131 }
132 }
133
134 return null;
135 }
136 }
137}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
index 33cc838..6f364ae 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/RemoteGridServiceConnector.cs
@@ -53,6 +53,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
53 private IGridService m_LocalGridService; 53 private IGridService m_LocalGridService;
54 private IGridService m_RemoteGridService; 54 private IGridService m_RemoteGridService;
55 55
56 private RegionInfoCache m_RegionInfoCache = new RegionInfoCache();
57
56 public RemoteGridServicesConnector() 58 public RemoteGridServicesConnector()
57 { 59 {
58 } 60 }
@@ -169,10 +171,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
169 171
170 public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID) 172 public GridRegion GetRegionByUUID(UUID scopeID, UUID regionID)
171 { 173 {
172 GridRegion rinfo = m_LocalGridService.GetRegionByUUID(scopeID, regionID); 174 bool inCache = false;
175 GridRegion rinfo = m_RegionInfoCache.Get(scopeID,regionID,out inCache);
176 if (inCache)
177 return rinfo;
178
179 rinfo = m_LocalGridService.GetRegionByUUID(scopeID, regionID);
173 if (rinfo == null) 180 if (rinfo == null)
174 rinfo = m_RemoteGridService.GetRegionByUUID(scopeID, regionID); 181 rinfo = m_RemoteGridService.GetRegionByUUID(scopeID, regionID);
175 182
183 m_RegionInfoCache.Cache(scopeID,regionID,rinfo);
176 return rinfo; 184 return rinfo;
177 } 185 }
178 186
@@ -187,10 +195,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
187 195
188 public GridRegion GetRegionByName(UUID scopeID, string regionName) 196 public GridRegion GetRegionByName(UUID scopeID, string regionName)
189 { 197 {
190 GridRegion rinfo = m_LocalGridService.GetRegionByName(scopeID, regionName); 198 bool inCache = false;
199 GridRegion rinfo = m_RegionInfoCache.Get(scopeID,regionName, out inCache);
200 if (inCache)
201 return rinfo;
202
203 rinfo = m_LocalGridService.GetRegionByName(scopeID, regionName);
191 if (rinfo == null) 204 if (rinfo == null)
192 rinfo = m_RemoteGridService.GetRegionByName(scopeID, regionName); 205 rinfo = m_RemoteGridService.GetRegionByName(scopeID, regionName);
193 206
207 // can't cache negative results for name lookups
208 m_RegionInfoCache.Cache(rinfo);
194 return rinfo; 209 return rinfo;
195 } 210 }
196 211
@@ -204,8 +219,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
204 { 219 {
205 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetRegionsByName {0} found {1} regions", name, grinfo.Count); 220 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetRegionsByName {0} found {1} regions", name, grinfo.Count);
206 foreach (GridRegion r in grinfo) 221 foreach (GridRegion r in grinfo)
222 {
223 m_RegionInfoCache.Cache(r);
207 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null) 224 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
208 rinfo.Add(r); 225 rinfo.Add(r);
226 }
209 } 227 }
210 228
211 return rinfo; 229 return rinfo;
@@ -221,8 +239,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
221 { 239 {
222 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetRegionRange {0} found {1} regions", name, grinfo.Count); 240 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetRegionRange {0} found {1} regions", name, grinfo.Count);
223 foreach (GridRegion r in grinfo) 241 foreach (GridRegion r in grinfo)
242 {
243 m_RegionInfoCache.Cache(r);
224 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null) 244 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
225 rinfo.Add(r); 245 rinfo.Add(r);
246 }
226 } 247 }
227 248
228 return rinfo; 249 return rinfo;
@@ -238,8 +259,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
238 { 259 {
239 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetDefaultRegions {0} found {1} regions", name, grinfo.Count); 260 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetDefaultRegions {0} found {1} regions", name, grinfo.Count);
240 foreach (GridRegion r in grinfo) 261 foreach (GridRegion r in grinfo)
262 {
263 m_RegionInfoCache.Cache(r);
241 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null) 264 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
242 rinfo.Add(r); 265 rinfo.Add(r);
266 }
243 } 267 }
244 268
245 return rinfo; 269 return rinfo;
@@ -255,8 +279,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
255 { 279 {
256 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetFallbackRegions {0} found {1} regions", name, grinfo.Count); 280 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetFallbackRegions {0} found {1} regions", name, grinfo.Count);
257 foreach (GridRegion r in grinfo) 281 foreach (GridRegion r in grinfo)
282 {
283 m_RegionInfoCache.Cache(r);
258 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null) 284 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
259 rinfo.Add(r); 285 rinfo.Add(r);
286 }
260 } 287 }
261 288
262 return rinfo; 289 return rinfo;
@@ -272,8 +299,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
272 { 299 {
273 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetHyperlinks {0} found {1} regions", name, grinfo.Count); 300 //m_log.DebugFormat("[REMOTE GRID CONNECTOR]: Remote GetHyperlinks {0} found {1} regions", name, grinfo.Count);
274 foreach (GridRegion r in grinfo) 301 foreach (GridRegion r in grinfo)
302 {
303 m_RegionInfoCache.Cache(r);
275 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null) 304 if (rinfo.Find(delegate(GridRegion gr) { return gr.RegionID == r.RegionID; }) == null)
276 rinfo.Add(r); 305 rinfo.Add(r);
306 }
277 } 307 }
278 308
279 return rinfo; 309 return rinfo;