kick Xfermanager from heartbeat and expires files based on its timming
							parent
							
								
									415c45b097
								
							
						
					
					
						commit
						941971648e
					
				|  | @ -28,10 +28,12 @@ | |||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Threading; | ||||
| using Nini.Config; | ||||
| using log4net; | ||||
| using OpenMetaverse; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Framework.Monitoring; | ||||
| using OpenSim.Region.Framework.Interfaces; | ||||
| using OpenSim.Region.Framework.Scenes; | ||||
| 
 | ||||
|  | @ -45,9 +47,14 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
|         private Scene m_scene; | ||||
|         private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); | ||||
|         private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | ||||
|         private double lastFilesExpire = 0; | ||||
|         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
| 
 | ||||
|         private object timeTickLock = new object(); | ||||
|         private double lastTimeTick = 0.0; | ||||
|         private bool   inTimeTick = false; | ||||
|         private double lastFilesExpire = 0.0; | ||||
| 
 | ||||
|         public struct XferRequest | ||||
|         { | ||||
|             public IClientAPI remoteClient; | ||||
|  | @ -67,20 +74,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
| 
 | ||||
|         public void Initialise(IConfigSource config) | ||||
|         { | ||||
|             lastFilesExpire = Util.GetTimeStampMS() + 300000.0; | ||||
|             lastTimeTick = Util.GetTimeStampMS() + 30000.0; | ||||
|             lastFilesExpire = lastTimeTick + 180000.0; | ||||
|         } | ||||
| 
 | ||||
|         public void AddRegion(Scene scene) | ||||
|         { | ||||
|             m_scene = scene; | ||||
|             m_scene.EventManager.OnNewClient += NewClient; | ||||
| 
 | ||||
|             m_scene.EventManager.OnRegionHeartbeatEnd += OnTimeTick; | ||||
|             m_scene.RegisterModuleInterface<IXfer>(this); | ||||
|         } | ||||
| 
 | ||||
|         public void RemoveRegion(Scene scene) | ||||
|         { | ||||
|             m_scene.EventManager.OnNewClient -= NewClient; | ||||
|              m_scene.EventManager.OnRegionHeartbeatEnd -= OnTimeTick; | ||||
| 
 | ||||
|             m_scene.UnregisterModuleInterface<IXfer>(this); | ||||
|             m_scene = null; | ||||
|  | @ -106,6 +115,35 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         public void OnTimeTick(Scene scene) | ||||
|         { | ||||
|             // we are on a heartbeat thread we there can be several | ||||
|             if(Monitor.TryEnter(timeTickLock)) | ||||
|             { | ||||
|                 if(!inTimeTick) | ||||
|                 { | ||||
|                     double now = Util.GetTimeStampMS(); | ||||
|                     if(now - lastTimeTick > 1500.0) // 1.5 second | ||||
|                     { | ||||
|                         inTimeTick = true; | ||||
| 
 | ||||
|                         //don't overload busy heartbeat | ||||
|                         WorkManager.RunInThread( | ||||
|                         delegate | ||||
|                         { | ||||
|                             transfersTimeTick(now); | ||||
|                             expireFiles(now); | ||||
| 
 | ||||
|                             lastTimeTick = now; | ||||
|                             inTimeTick = false; | ||||
|                         }, | ||||
|                         null, | ||||
|                         "XferTimeTick"); | ||||
|                     } | ||||
|                 } | ||||
|                 Monitor.Exit(timeTickLock); | ||||
|             } | ||||
|         } | ||||
|         #region IXfer Members | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -135,26 +173,31 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
|                     fd.timeStampMS = now; | ||||
|                     NewFiles.Add(fileName, fd); | ||||
|                 } | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|                 // lazy expires hopefully we will not have many files so nasty code will do it | ||||
|                 if(now - lastFilesExpire > 180000.0) | ||||
|         #endregion | ||||
|         public void expireFiles(double now) | ||||
|         { | ||||
|             lock (NewFiles) | ||||
|             { | ||||
|                 // hopefully we will not have many files so nasty code will do it | ||||
|                 if(now - lastFilesExpire > 120000.0) | ||||
|                 { | ||||
|                     lastFilesExpire = now; | ||||
|                     List<string> expires = new List<string>(); | ||||
|                     foreach(string fname in NewFiles.Keys) | ||||
|                     { | ||||
|                         if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 180000.0) | ||||
|                         if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 120000.0) | ||||
|                             expires.Add(fname); | ||||
|                     } | ||||
|                     foreach(string fname in expires) | ||||
|                         NewFiles.Remove(fname); | ||||
|                 } | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         public void NewClient(IClientAPI client) | ||||
|         { | ||||
|             client.OnRequestXfer += RequestXfer; | ||||
|  | @ -162,6 +205,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
|             client.OnAbortXfer += AbortXfer; | ||||
|         } | ||||
| 
 | ||||
|         public void transfersTimeTick(double now) | ||||
|         { | ||||
|          | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// | ||||
|         /// </summary> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 UbitUmarov
						UbitUmarov