Improvements to the ServiceThrottleModule: added a category and an itemid to the interface, so that duplicate requests aren't enqueued more than once.
parent
5f27aaa6dd
commit
9432f3c94d
|
@ -50,17 +50,15 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||||
private readonly List<Scene> m_scenes = new List<Scene>();
|
private readonly List<Scene> m_scenes = new List<Scene>();
|
||||||
private System.Timers.Timer m_timer = new System.Timers.Timer();
|
private System.Timers.Timer m_timer = new System.Timers.Timer();
|
||||||
|
|
||||||
//private OpenSim.Framework.BlockingQueue<GridRegionRequest> m_RequestQueue = new OpenSim.Framework.BlockingQueue<GridRegionRequest>();
|
|
||||||
// private OpenSim.Framework.DoubleQueue<GridRegionRequest> m_RequestQueue = new OpenSim.Framework.DoubleQueue<GridRegionRequest>();
|
|
||||||
//private Queue<GridRegionRequest> m_RequestQueue = new Queue<GridRegionRequest>();
|
|
||||||
private Queue<Action> m_RequestQueue = new Queue<Action>();
|
private Queue<Action> m_RequestQueue = new Queue<Action>();
|
||||||
|
private Dictionary<string, List<string>> m_Pending = new Dictionary<string, List<string>>();
|
||||||
private int m_Interval;
|
private int m_Interval;
|
||||||
|
|
||||||
#region ISharedRegionModule
|
#region ISharedRegionModule
|
||||||
|
|
||||||
public void Initialise(IConfigSource config)
|
public void Initialise(IConfigSource config)
|
||||||
{
|
{
|
||||||
m_Interval = Util.GetConfigVarFromSections<int>(config, "Interval", new string[] { "ServiceThrottle" }, 2000);
|
m_Interval = Util.GetConfigVarFromSections<int>(config, "Interval", new string[] { "ServiceThrottle" }, 5000);
|
||||||
|
|
||||||
m_timer = new System.Timers.Timer();
|
m_timer = new System.Timers.Timer();
|
||||||
m_timer.AutoReset = false;
|
m_timer.AutoReset = false;
|
||||||
|
@ -159,18 +157,37 @@ namespace OpenSim.Region.CoreModules.Framework
|
||||||
client.SendRegionHandle(regionID, r.RegionHandle);
|
client.SendRegionHandle(regionID, r.RegionHandle);
|
||||||
};
|
};
|
||||||
|
|
||||||
lock (m_RequestQueue)
|
Enqueue("region", regionID.ToString(), action);
|
||||||
m_RequestQueue.Enqueue(action);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Events
|
#endregion Events
|
||||||
|
|
||||||
#region IServiceThrottleModule
|
#region IServiceThrottleModule
|
||||||
|
|
||||||
public void Enqueue(Action continuation)
|
public void Enqueue(string category, string itemid, Action continuation)
|
||||||
{
|
{
|
||||||
m_RequestQueue.Enqueue(continuation);
|
lock (m_RequestQueue)
|
||||||
|
{
|
||||||
|
if (m_Pending.ContainsKey(category))
|
||||||
|
{
|
||||||
|
if (m_Pending[category].Contains(itemid))
|
||||||
|
// Don't enqueue, it's already pending
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
m_Pending.Add(category, new List<string>());
|
||||||
|
|
||||||
|
m_Pending[category].Add(itemid);
|
||||||
|
|
||||||
|
m_RequestQueue.Enqueue(delegate
|
||||||
|
{
|
||||||
|
continuation();
|
||||||
|
lock (m_RequestQueue)
|
||||||
|
{
|
||||||
|
m_Pending[category].Remove(itemid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion IServiceThrottleModule
|
#endregion IServiceThrottleModule
|
||||||
|
|
|
@ -173,7 +173,7 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not found in cache, queue continuation
|
// Not found in cache, queue continuation
|
||||||
m_ServiceThrottle.Enqueue(delegate
|
m_ServiceThrottle.Enqueue("name", uuid.ToString(), delegate
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[YYY]: Name request {0}", uuid);
|
//m_log.DebugFormat("[YYY]: Name request {0}", uuid);
|
||||||
bool foundRealName = TryGetUserNames(uuid, names);
|
bool foundRealName = TryGetUserNames(uuid, names);
|
||||||
|
|
|
@ -5,7 +5,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
public interface IServiceThrottleModule
|
public interface IServiceThrottleModule
|
||||||
{
|
{
|
||||||
void Enqueue(Action continuation);
|
/// <summary>
|
||||||
|
/// Enqueue a continuation meant to get a resource from elsewhere.
|
||||||
|
/// As usual with CPS, caller beware: if that continuation is a never-ending computation,
|
||||||
|
/// the whole thread will be blocked, and no requests are processed
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="category">Category of the resource (e.g. name, region)</param>
|
||||||
|
/// <param name="itemid">The resource identifier</param>
|
||||||
|
/// <param name="continuation">The continuation to be executed</param>
|
||||||
|
void Enqueue(string category, string itemid, Action continuation);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1727,5 +1727,9 @@ MaxStringSpace = 0
|
||||||
;; {MaxDistance} {} {Cut-off distance at which sounds will not be sent to users} {100.0}
|
;; {MaxDistance} {} {Cut-off distance at which sounds will not be sent to users} {100.0}
|
||||||
MaxDistance = 100.0
|
MaxDistance = 100.0
|
||||||
|
|
||||||
|
[ServiceThrottle]
|
||||||
|
;; Default time interval (in ms) for the throttle service thread to wake up
|
||||||
|
Interval = 5000
|
||||||
|
|
||||||
[Modules]
|
[Modules]
|
||||||
Include-modules = "addon-modules/*/config/*.ini"
|
Include-modules = "addon-modules/*/config/*.ini"
|
||||||
|
|
Loading…
Reference in New Issue