diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index 3dfa2eba10..89e89ce9c0 100755 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -67,6 +67,10 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory private object m_setAppearanceLock = new object(); + // add throttle + private ConcurrentDictionary m_rebakeThrottle = new ConcurrentDictionary(); + private const int REBAKE_THROTTLE_SECONDS = 30; + #region Region Module interface public void Initialise(IConfigSource config) @@ -451,10 +455,32 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory sp.Appearance.WearableCacheItems = wearableCache; + // throttle rebake requests + if (missing.Count > 0) { + long now = DateTime.UtcNow.Ticks; + foreach (UUID id in missing) + { + string key = sp.UUID.ToString() + ":" + id.ToString(); + + long last; + if (m_rebakeThrottle.TryGetValue(key, out last)) + { + TimeSpan age = new TimeSpan(now - last); + if (age.TotalSeconds < REBAKE_THROTTLE_SECONDS) + continue; + } + + m_rebakeThrottle[key] = now; + + m_log.DebugFormat( + "[AVFACTORY]: Missing baked texture {0} for {1}, requesting rebake", + id, sp.Name); + sp.ControllingClient.SendRebakeAvatarTextures(id); + } } bool changed = false;