diff options
author | UbitUmarov | 2012-12-13 02:55:36 +0000 |
---|---|---|
committer | UbitUmarov | 2012-12-13 02:55:36 +0000 |
commit | 20773dcfccc04d8af14e27f87746711bfaba07b1 (patch) | |
tree | b1428733102b796e1fd87e204da4d24b9f66b670 /OpenSim | |
parent | make ubitODE ignore X and Y rotation components on avatar rotations (diff) | |
download | opensim-SC-20773dcfccc04d8af14e27f87746711bfaba07b1.zip opensim-SC-20773dcfccc04d8af14e27f87746711bfaba07b1.tar.gz opensim-SC-20773dcfccc04d8af14e27f87746711bfaba07b1.tar.bz2 opensim-SC-20773dcfccc04d8af14e27f87746711bfaba07b1.tar.xz |
add a Check method to flotsamAssetCache, so to check if a asset is in
cache without actually loading it. Make use limited use of it in
avatarfactory textures check. Also on llclientview
HandleAgentTextureCached that now should work. Other asset cache modules
for now will return false, so are broken. baked textures logic
still unchanged. *UNTESTED*
Diffstat (limited to '')
7 files changed, 151 insertions, 20 deletions
diff --git a/OpenSim/Framework/IImprovedAssetCache.cs b/OpenSim/Framework/IImprovedAssetCache.cs index 251215a..a0b8b55 100644 --- a/OpenSim/Framework/IImprovedAssetCache.cs +++ b/OpenSim/Framework/IImprovedAssetCache.cs | |||
@@ -33,6 +33,7 @@ namespace OpenSim.Framework | |||
33 | { | 33 | { |
34 | void Cache(AssetBase asset); | 34 | void Cache(AssetBase asset); |
35 | AssetBase Get(string id); | 35 | AssetBase Get(string id); |
36 | bool Check(string id); | ||
36 | void Expire(string id); | 37 | void Expire(string id); |
37 | void Clear(); | 38 | void Clear(); |
38 | } | 39 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index ea3c6a4..edb1a9d 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -3992,7 +3992,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3992 | 3992 | ||
3993 | const float TIME_DILATION = 1.0f; | 3993 | const float TIME_DILATION = 1.0f; |
3994 | ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); | 3994 | ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); |
3995 | |||
3996 | 3995 | ||
3997 | if (terseAgentUpdateBlocks.IsValueCreated) | 3996 | if (terseAgentUpdateBlocks.IsValueCreated) |
3998 | { | 3997 | { |
@@ -11695,14 +11694,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11695 | cachedresp.WearableData = | 11694 | cachedresp.WearableData = |
11696 | new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; | 11695 | new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; |
11697 | 11696 | ||
11698 | for (int i = 0; i < cachedtex.WearableData.Length; i++) | 11697 | IImprovedAssetCache cache = m_scene.RequestModuleInterface<IImprovedAssetCache>(); |
11698 | if (cache == null) | ||
11699 | { | 11699 | { |
11700 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | 11700 | for (int i = 0; i < cachedtex.WearableData.Length; i++) |
11701 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | 11701 | { |
11702 | cachedresp.WearableData[i].TextureID = UUID.Zero; | 11702 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); |
11703 | cachedresp.WearableData[i].HostName = new byte[0]; | 11703 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; |
11704 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11705 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11706 | } | ||
11707 | } | ||
11708 | else | ||
11709 | { | ||
11710 | for (int i = 0; i < cachedtex.WearableData.Length; i++) | ||
11711 | { | ||
11712 | cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock(); | ||
11713 | cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex; | ||
11714 | if(cache.Check(cachedtex.WearableData[i].ID.ToString())) | ||
11715 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11716 | else | ||
11717 | cachedresp.WearableData[i].TextureID = UUID.Zero; | ||
11718 | cachedresp.WearableData[i].HostName = new byte[0]; | ||
11719 | } | ||
11704 | } | 11720 | } |
11705 | |||
11706 | cachedresp.Header.Zerocoded = true; | 11721 | cachedresp.Header.Zerocoded = true; |
11707 | OutPacket(cachedresp, ThrottleOutPacketType.Task); | 11722 | OutPacket(cachedresp, ThrottleOutPacketType.Task); |
11708 | 11723 | ||
diff --git a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs index e40caec..f43305f 100644 --- a/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/CenomeAssetCache.cs | |||
@@ -194,6 +194,12 @@ namespace OpenSim.Region.CoreModules.Asset | |||
194 | 194 | ||
195 | #region IImprovedAssetCache Members | 195 | #region IImprovedAssetCache Members |
196 | 196 | ||
197 | |||
198 | public bool Check(string id) | ||
199 | { | ||
200 | return false; | ||
201 | } | ||
202 | |||
197 | /// <summary> | 203 | /// <summary> |
198 | /// Cache asset. | 204 | /// Cache asset. |
199 | /// </summary> | 205 | /// </summary> |
diff --git a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs index 9742a5c..58ce61a 100644 --- a/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/CoreAssetCache.cs | |||
@@ -112,6 +112,10 @@ namespace OpenSim.Region.CoreModules.Asset | |||
112 | //////////////////////////////////////////////////////////// | 112 | //////////////////////////////////////////////////////////// |
113 | // IImprovedAssetCache | 113 | // IImprovedAssetCache |
114 | // | 114 | // |
115 | public bool Check(string id) | ||
116 | { | ||
117 | return false; | ||
118 | } | ||
115 | 119 | ||
116 | public void Cache(AssetBase asset) | 120 | public void Cache(AssetBase asset) |
117 | { | 121 | { |
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index b1bb56b..a0f1e8c 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | |||
@@ -348,6 +348,17 @@ namespace OpenSim.Region.CoreModules.Asset | |||
348 | return asset; | 348 | return asset; |
349 | } | 349 | } |
350 | 350 | ||
351 | private bool CheckFromMemoryCache(string id) | ||
352 | { | ||
353 | AssetBase asset = null; | ||
354 | |||
355 | if (m_MemoryCache.TryGetValue(id, out asset)) | ||
356 | return true; | ||
357 | |||
358 | return false; | ||
359 | } | ||
360 | |||
361 | |||
351 | /// <summary> | 362 | /// <summary> |
352 | /// Try to get an asset from the file cache. | 363 | /// Try to get an asset from the file cache. |
353 | /// </summary> | 364 | /// </summary> |
@@ -420,6 +431,50 @@ namespace OpenSim.Region.CoreModules.Asset | |||
420 | return asset; | 431 | return asset; |
421 | } | 432 | } |
422 | 433 | ||
434 | private bool CheckFromFileCache(string id) | ||
435 | { | ||
436 | bool found = false; | ||
437 | |||
438 | string filename = GetFileName(id); | ||
439 | if (File.Exists(filename)) | ||
440 | { | ||
441 | // actually check if we can open it, and so update expire | ||
442 | FileStream stream = null; | ||
443 | try | ||
444 | { | ||
445 | stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read); | ||
446 | if (stream != null) | ||
447 | { | ||
448 | found = true; | ||
449 | stream.Close(); | ||
450 | } | ||
451 | |||
452 | } | ||
453 | catch (System.Runtime.Serialization.SerializationException e) | ||
454 | { | ||
455 | found = false; | ||
456 | m_log.ErrorFormat( | ||
457 | "[FLOTSAM ASSET CACHE]: Failed to check file {0} for asset {1}. Exception {2} {3}", | ||
458 | filename, id, e.Message, e.StackTrace); | ||
459 | |||
460 | // If there was a problem deserializing the asset, the asset may | ||
461 | // either be corrupted OR was serialized under an old format | ||
462 | // {different version of AssetBase} -- we should attempt to | ||
463 | // delete it and re-cache | ||
464 | File.Delete(filename); | ||
465 | } | ||
466 | catch (Exception e) | ||
467 | { | ||
468 | found = false; | ||
469 | m_log.ErrorFormat( | ||
470 | "[FLOTSAM ASSET CACHE]: Failed to check file {0} for asset {1}. Exception {2} {3}", | ||
471 | filename, id, e.Message, e.StackTrace); | ||
472 | } | ||
473 | } | ||
474 | |||
475 | return found; | ||
476 | } | ||
477 | |||
423 | public AssetBase Get(string id) | 478 | public AssetBase Get(string id) |
424 | { | 479 | { |
425 | m_Requests++; | 480 | m_Requests++; |
@@ -456,11 +511,26 @@ namespace OpenSim.Region.CoreModules.Asset | |||
456 | return asset; | 511 | return asset; |
457 | } | 512 | } |
458 | 513 | ||
514 | public bool Check(string id) | ||
515 | { | ||
516 | if (m_MemoryCacheEnabled && CheckFromMemoryCache(id)) | ||
517 | return true; | ||
518 | |||
519 | if (m_FileCacheEnabled && CheckFromFileCache(id)) | ||
520 | return true; | ||
521 | return false; | ||
522 | } | ||
523 | |||
459 | public AssetBase GetCached(string id) | 524 | public AssetBase GetCached(string id) |
460 | { | 525 | { |
461 | return Get(id); | 526 | return Get(id); |
462 | } | 527 | } |
463 | 528 | ||
529 | public AssetBase CheckCached(string id) | ||
530 | { | ||
531 | return Get(id); | ||
532 | } | ||
533 | |||
464 | public void Expire(string id) | 534 | public void Expire(string id) |
465 | { | 535 | { |
466 | if (m_LogLevel >= 2) | 536 | if (m_LogLevel >= 2) |
@@ -941,6 +1011,11 @@ namespace OpenSim.Region.CoreModules.Asset | |||
941 | return asset.Data; | 1011 | return asset.Data; |
942 | } | 1012 | } |
943 | 1013 | ||
1014 | public bool CheckData(string id) | ||
1015 | { | ||
1016 | return Check(id); ; | ||
1017 | } | ||
1018 | |||
944 | public bool Get(string id, object sender, AssetRetrieved handler) | 1019 | public bool Get(string id, object sender, AssetRetrieved handler) |
945 | { | 1020 | { |
946 | AssetBase asset = Get(id); | 1021 | AssetBase asset = Get(id); |
diff --git a/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs b/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs index 9592ca0..ce9b546 100644 --- a/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/GlynnTuckerAssetCache.cs | |||
@@ -115,6 +115,11 @@ namespace OpenSim.Region.CoreModules.Asset | |||
115 | // IImprovedAssetCache | 115 | // IImprovedAssetCache |
116 | // | 116 | // |
117 | 117 | ||
118 | public bool Check(string id) | ||
119 | { | ||
120 | return false; | ||
121 | } | ||
122 | |||
118 | public void Cache(AssetBase asset) | 123 | public void Cache(AssetBase asset) |
119 | { | 124 | { |
120 | if (asset != null) | 125 | if (asset != null) |
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 4c42397..3532b1d 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs | |||
@@ -361,6 +361,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
361 | public bool ValidateBakedTextureCache(IScenePresence sp) | 361 | public bool ValidateBakedTextureCache(IScenePresence sp) |
362 | { | 362 | { |
363 | bool defonly = true; // are we only using default textures | 363 | bool defonly = true; // are we only using default textures |
364 | IImprovedAssetCache cache = m_scene.RequestModuleInterface<IImprovedAssetCache>(); | ||
364 | 365 | ||
365 | // Process the texture entry | 366 | // Process the texture entry |
366 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) | 367 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) |
@@ -385,8 +386,16 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
385 | 386 | ||
386 | defonly = false; // found a non-default texture reference | 387 | defonly = false; // found a non-default texture reference |
387 | 388 | ||
388 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) | 389 | if (cache != null) |
389 | return false; | 390 | { |
391 | if (!cache.Check(face.TextureID.ToString())) | ||
392 | return false; | ||
393 | } | ||
394 | else | ||
395 | { | ||
396 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) | ||
397 | return false; | ||
398 | } | ||
390 | } | 399 | } |
391 | 400 | ||
392 | // m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); | 401 | // m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0} {1}", sp.Name, sp.UUID); |
@@ -398,6 +407,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
398 | public int RequestRebake(IScenePresence sp, bool missingTexturesOnly) | 407 | public int RequestRebake(IScenePresence sp, bool missingTexturesOnly) |
399 | { | 408 | { |
400 | int texturesRebaked = 0; | 409 | int texturesRebaked = 0; |
410 | IImprovedAssetCache cache = m_scene.RequestModuleInterface<IImprovedAssetCache>(); | ||
401 | 411 | ||
402 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) | 412 | for (int i = 0; i < AvatarAppearance.BAKE_INDICES.Length; i++) |
403 | { | 413 | { |
@@ -421,21 +431,36 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory | |||
421 | 431 | ||
422 | if (missingTexturesOnly) | 432 | if (missingTexturesOnly) |
423 | { | 433 | { |
424 | if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) | 434 | if (cache != null) |
425 | { | 435 | { |
426 | continue; | 436 | if (cache.Check(face.TextureID.ToString())) |
437 | continue; | ||
438 | else | ||
439 | { | ||
440 | m_log.DebugFormat( | ||
441 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | ||
442 | face.TextureID, idx, sp.Name); | ||
443 | } | ||
427 | } | 444 | } |
428 | else | 445 | else |
429 | { | 446 | { |
430 | // On inter-simulator teleports, this occurs if baked textures are not being stored by the | 447 | if (m_scene.AssetService.Get(face.TextureID.ToString()) != null) |
431 | // grid asset service (which means that they are not available to the new region and so have | 448 | { |
432 | // to be re-requested from the client). | 449 | continue; |
433 | // | 450 | } |
434 | // The only available core OpenSimulator behaviour right now | 451 | |
435 | // is not to store these textures, temporarily or otherwise. | 452 | else |
436 | m_log.DebugFormat( | 453 | { |
437 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | 454 | // On inter-simulator teleports, this occurs if baked textures are not being stored by the |
438 | face.TextureID, idx, sp.Name); | 455 | // grid asset service (which means that they are not available to the new region and so have |
456 | // to be re-requested from the client). | ||
457 | // | ||
458 | // The only available core OpenSimulator behaviour right now | ||
459 | // is not to store these textures, temporarily or otherwise. | ||
460 | m_log.DebugFormat( | ||
461 | "[AVFACTORY]: Missing baked texture {0} ({1}) for {2}, requesting rebake.", | ||
462 | face.TextureID, idx, sp.Name); | ||
463 | } | ||
439 | } | 464 | } |
440 | } | 465 | } |
441 | else | 466 | else |