diff options
author | John Hurliman | 2010-04-05 14:52:25 -0700 |
---|---|---|
committer | John Hurliman | 2010-04-05 14:52:25 -0700 |
commit | f302224cafa9ffe8f47cce2274022e1ee2ed37d6 (patch) | |
tree | 3a8337e5b26c80cc94eb61572f4d60ae5534a40a | |
parent | check group membership and powers with the groups module rather than just the... (diff) | |
download | opensim-SC-f302224cafa9ffe8f47cce2274022e1ee2ed37d6.zip opensim-SC-f302224cafa9ffe8f47cce2274022e1ee2ed37d6.tar.gz opensim-SC-f302224cafa9ffe8f47cce2274022e1ee2ed37d6.tar.bz2 opensim-SC-f302224cafa9ffe8f47cce2274022e1ee2ed37d6.tar.xz |
* In the async asset fetch method, cache check before firing any async code. This should alleviate some "thread storm" issues when regions are starting up that hit Mono especially hard
-rw-r--r-- | OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs | 109 |
1 files changed, 62 insertions, 47 deletions
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 27434ad..4a7522f 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs | |||
@@ -112,59 +112,15 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
112 | 112 | ||
113 | public AssetBase Get(string id) | 113 | public AssetBase Get(string id) |
114 | { | 114 | { |
115 | AssetBase asset = null; | ||
116 | |||
117 | // Cache fetch | 115 | // Cache fetch |
118 | if (m_cache != null) | 116 | if (m_cache != null) |
119 | { | 117 | { |
120 | asset = m_cache.Get(id); | 118 | AssetBase asset = m_cache.Get(id); |
121 | if (asset != null) | 119 | if (asset != null) |
122 | return asset; | 120 | return asset; |
123 | } | 121 | } |
124 | 122 | ||
125 | Uri url; | 123 | return GetRemote(id); |
126 | |||
127 | // Determine if id is an absolute URL or a grid-relative UUID | ||
128 | if (!Uri.TryCreate(id, UriKind.Absolute, out url)) | ||
129 | url = new Uri(m_serverUrl + id); | ||
130 | |||
131 | try | ||
132 | { | ||
133 | HttpWebRequest request = UntrustedHttpWebRequest.Create(url); | ||
134 | |||
135 | using (WebResponse response = request.GetResponse()) | ||
136 | { | ||
137 | using (Stream responseStream = response.GetResponseStream()) | ||
138 | { | ||
139 | string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty; | ||
140 | |||
141 | // Create the asset object | ||
142 | asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID); | ||
143 | |||
144 | UUID assetID; | ||
145 | if (UUID.TryParse(id, out assetID)) | ||
146 | asset.FullID = assetID; | ||
147 | |||
148 | // Grab the asset data from the response stream | ||
149 | using (MemoryStream stream = new MemoryStream()) | ||
150 | { | ||
151 | responseStream.CopyTo(stream, Int32.MaxValue); | ||
152 | asset.Data = stream.ToArray(); | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | |||
157 | // Cache store | ||
158 | if (m_cache != null && asset != null) | ||
159 | m_cache.Cache(asset); | ||
160 | |||
161 | return asset; | ||
162 | } | ||
163 | catch (Exception ex) | ||
164 | { | ||
165 | m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message); | ||
166 | return null; | ||
167 | } | ||
168 | } | 124 | } |
169 | 125 | ||
170 | /// <summary> | 126 | /// <summary> |
@@ -245,10 +201,21 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
245 | /// <returns>True if the id was parseable, false otherwise</returns> | 201 | /// <returns>True if the id was parseable, false otherwise</returns> |
246 | public bool Get(string id, Object sender, AssetRetrieved handler) | 202 | public bool Get(string id, Object sender, AssetRetrieved handler) |
247 | { | 203 | { |
204 | // Cache fetch | ||
205 | if (m_cache != null) | ||
206 | { | ||
207 | AssetBase asset = m_cache.Get(id); | ||
208 | if (asset != null) | ||
209 | { | ||
210 | Util.FireAndForget(delegate(object o) { handler(id, sender, asset); }); | ||
211 | return true; | ||
212 | } | ||
213 | } | ||
214 | |||
248 | Util.FireAndForget( | 215 | Util.FireAndForget( |
249 | delegate(object o) | 216 | delegate(object o) |
250 | { | 217 | { |
251 | AssetBase asset = Get(id); | 218 | AssetBase asset = GetRemote(id); |
252 | handler(id, sender, asset); | 219 | handler(id, sender, asset); |
253 | } | 220 | } |
254 | ); | 221 | ); |
@@ -406,5 +373,53 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
406 | } | 373 | } |
407 | 374 | ||
408 | #endregion IAssetService | 375 | #endregion IAssetService |
376 | |||
377 | private AssetBase GetRemote(string id) | ||
378 | { | ||
379 | AssetBase asset = null; | ||
380 | Uri url; | ||
381 | |||
382 | // Determine if id is an absolute URL or a grid-relative UUID | ||
383 | if (!Uri.TryCreate(id, UriKind.Absolute, out url)) | ||
384 | url = new Uri(m_serverUrl + id); | ||
385 | |||
386 | try | ||
387 | { | ||
388 | HttpWebRequest request = UntrustedHttpWebRequest.Create(url); | ||
389 | |||
390 | using (WebResponse response = request.GetResponse()) | ||
391 | { | ||
392 | using (Stream responseStream = response.GetResponseStream()) | ||
393 | { | ||
394 | string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty; | ||
395 | |||
396 | // Create the asset object | ||
397 | asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID); | ||
398 | |||
399 | UUID assetID; | ||
400 | if (UUID.TryParse(id, out assetID)) | ||
401 | asset.FullID = assetID; | ||
402 | |||
403 | // Grab the asset data from the response stream | ||
404 | using (MemoryStream stream = new MemoryStream()) | ||
405 | { | ||
406 | responseStream.CopyTo(stream, Int32.MaxValue); | ||
407 | asset.Data = stream.ToArray(); | ||
408 | } | ||
409 | } | ||
410 | } | ||
411 | |||
412 | // Cache store | ||
413 | if (m_cache != null && asset != null) | ||
414 | m_cache.Cache(asset); | ||
415 | |||
416 | return asset; | ||
417 | } | ||
418 | catch (Exception ex) | ||
419 | { | ||
420 | m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message); | ||
421 | return null; | ||
422 | } | ||
423 | } | ||
409 | } | 424 | } |
410 | } | 425 | } |