From 99b9c1a9d5d4d9b76609ab8f91dd8d9ebe248ff5 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 20 Feb 2012 10:58:07 -0800 Subject: More improvements on agent position updates: if the target sims fail, blacklist them for 2 min, so that we don't keep doing remote calls that fail. --- .../Simulation/SimulationServiceConnector.cs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'OpenSim/Services/Connectors/Simulation') diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index c45f456..c45e312 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs @@ -153,6 +153,7 @@ namespace OpenSim.Services.Connectors.Simulation return UpdateAgent(destination, (IAgentData)data, 200000); // yes, 200 seconds } + private ExpiringCache _failedSims = new ExpiringCache(); /// /// Send updated position information about an agent in this region to a neighbor /// This operation may be called very frequently if an avatar is moving about in @@ -160,6 +161,10 @@ namespace OpenSim.Services.Connectors.Simulation /// public bool UpdateAgent(GridRegion destination, AgentPosition data) { + bool v = true; + if (_failedSims.TryGetValue(destination.ServerURI, out v)) + return false; + // The basic idea of this code is that the first thread that needs to // send an update for a specific avatar becomes the worker for any subsequent // requests until there are no more outstanding requests. Further, only send the most @@ -183,9 +188,10 @@ namespace OpenSim.Services.Connectors.Simulation // Otherwise update the reference and start processing m_updateAgentQueue[uri] = data; } - + AgentPosition pos = null; - while (true) + bool success = true; + while (success) { lock (m_updateAgentQueue) { @@ -205,11 +211,13 @@ namespace OpenSim.Services.Connectors.Simulation } } - UpdateAgent(destination, (IAgentData)pos, 10000); + success = UpdateAgent(destination, (IAgentData)pos, 10000); } - - // unreachable -// return true; + // we get here iff success == false + // blacklist sim for 2 minutes + _failedSims.AddOrUpdate(destination.ServerURI, true, 120); + m_updateAgentQueue.Clear(); + return false; } /// -- cgit v1.1