diff options
Diffstat (limited to 'OpenSim/Framework/Communications/Cache')
-rw-r--r-- | OpenSim/Framework/Communications/Cache/AssetCache.cs | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index d1ff9c9..4765548 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs | |||
@@ -156,16 +156,58 @@ namespace OpenSim.Framework.Communications.Cache | |||
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
159 | /// <summary> | ||
160 | /// Get an asset. If the asset isn't in the cache, a request will be made to the persistent store to | ||
161 | /// load it into the cache. | ||
162 | /// | ||
163 | /// XXX We'll keep polling the cache until we get the asset or we exceed | ||
164 | /// the allowed number of polls. This isn't a very good way of doing things since a single thread | ||
165 | /// is processing inbound packets, so if the asset server is slow, we could block this for up to | ||
166 | /// the timeout period. What we might want to do is register asynchronous callbacks on asset | ||
167 | /// receipt in the same manner as the nascent (but not yet active) TextureDownloadModule. Of course, | ||
168 | /// a timeout before asset receipt usually isn't fatal, the operation will work on the retry when the | ||
169 | /// asset is much more likely to have made it into the cache. | ||
170 | /// </summary> | ||
171 | /// <param name="assetID"></param> | ||
172 | /// <param name="isTexture"></param> | ||
173 | /// <returns>null if the asset could not be retrieved</returns> | ||
159 | public AssetBase GetAsset(LLUUID assetID, bool isTexture) | 174 | public AssetBase GetAsset(LLUUID assetID, bool isTexture) |
160 | { | 175 | { |
176 | // I'm not going over 3 seconds since this will be blocking processing of all the other inbound | ||
177 | // packets from the client. | ||
178 | int pollPeriod = 200; | ||
179 | int maxPolls = 15; | ||
180 | |||
161 | AssetBase asset = GetCachedAsset(assetID); | 181 | AssetBase asset = GetCachedAsset(assetID); |
162 | if (asset == null) | 182 | if (asset != null) |
163 | { | 183 | { |
164 | m_assetServer.RequestAsset(assetID, isTexture); | 184 | return asset; |
165 | } | 185 | } |
166 | return asset; | 186 | |
187 | m_assetServer.RequestAsset(assetID, isTexture); | ||
188 | |||
189 | do | ||
190 | { | ||
191 | Thread.Sleep(pollPeriod); | ||
192 | |||
193 | asset = GetCachedAsset(assetID); | ||
194 | if (asset != null) | ||
195 | { | ||
196 | return asset; | ||
197 | } | ||
198 | } | ||
199 | while (--maxPolls > 0); | ||
200 | |||
201 | MainLog.Instance.Warn( | ||
202 | "ASSETCACHE", "Asset {0} was not received before the retrieval timeout was reached"); | ||
203 | |||
204 | return null; | ||
167 | } | 205 | } |
168 | 206 | ||
207 | /// <summary> | ||
208 | /// Add an asset to both the persistent store and the cache. | ||
209 | /// </summary> | ||
210 | /// <param name="asset"></param> | ||
169 | public void AddAsset(AssetBase asset) | 211 | public void AddAsset(AssetBase asset) |
170 | { | 212 | { |
171 | string temporary = asset.Temporary ? "temporary" : ""; | 213 | string temporary = asset.Temporary ? "temporary" : ""; |