From 22f09fbd213ffd414514756b4a7ee0e86325d733 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 8 Aug 2008 10:59:32 +0000 Subject: * All CheckRegion within an instance would use the same, global, bool for 'Available', which would lead to intermittent failures on parallell teleport requests. * Solidified CheckRegion somewhat, adding a second try if the first failed. --- .../Communications/IInterRegionCommunications.cs | 4 +- .../Communications/Local/LocalBackEndServices.cs | 11 +--- .../Region/Communications/OGS1/OGS1GridServices.cs | 64 +++++++++++++++------- .../Scenes/SceneCommunicationService.cs | 3 +- 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/OpenSim/Framework/Communications/IInterRegionCommunications.cs b/OpenSim/Framework/Communications/IInterRegionCommunications.cs index 28b0e12..57fb82d 100644 --- a/OpenSim/Framework/Communications/IInterRegionCommunications.cs +++ b/OpenSim/Framework/Communications/IInterRegionCommunications.cs @@ -32,8 +32,8 @@ namespace OpenSim.Framework.Communications public interface IInterRegionCommunications { string rdebugRegionName { get; set; } - bool Available { get; } - void CheckRegion(string address, uint port); + + bool CheckRegion(string address, uint port); bool InformRegionOfChildAgent(ulong regionHandle, AgentCircuitData agentData); bool InformRegionOfPrimCrossing(ulong regionHandle, LLUUID primID, string objData, int XMLMethod); bool RegionUp(SerializableRegionInfo region, ulong regionhandle); diff --git a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs index f967cf7..8d6bbcc 100644 --- a/OpenSim/Region/Communications/Local/LocalBackEndServices.cs +++ b/OpenSim/Region/Communications/Local/LocalBackEndServices.cs @@ -51,16 +51,9 @@ namespace OpenSim.Region.Communications.Local public string _gdebugRegionName = String.Empty; - bool m_bAvailable=true; - - public void CheckRegion(string address, uint port) - { - m_bAvailable = true; - } - - public bool Available + public bool CheckRegion(string address, uint port) { - get { return m_bAvailable; } + return true; } public string gdebugRegionName diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index a2cddec..af3b666 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -1558,36 +1558,60 @@ namespace OpenSim.Region.Communications.OGS1 bool m_bAvailable = false; int timeOut = 10; //10 seconds - public void CheckRegion(string address, uint port) + public bool CheckRegion(string address, uint port, bool retry) { - m_bAvailable = false; - IPAddress ia = null; + bool available = false; + bool timed_out = true; + + IPAddress ia; IPAddress.TryParse(address, out ia); IPEndPoint m_EndPoint = new IPEndPoint(ia, (int)port); - AsyncCallback ConnectedMethodCallback = new AsyncCallback(ConnectedMethod); - Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - IAsyncResult ar = socket.BeginConnect(m_EndPoint, ConnectedMethodCallback, socket); - ar.AsyncWaitHandle.WaitOne(timeOut*1000, false); - Thread.Sleep(500); - } - public bool Available - { - get { return m_bAvailable; } - } + AsyncCallback callback = delegate(IAsyncResult iar) + { + Socket s = (Socket)iar.AsyncState; + try + { + s.EndConnect(iar); + available = true; + timed_out = false; + } + catch (Exception e) + { + m_log.DebugFormat("Callback EndConnect exception: {0}:{1}", e.Message, e.StackTrace); + } + + s.Close(); + }; - void ConnectedMethod(IAsyncResult ar) - { - Socket socket = (Socket)ar.AsyncState; try { - socket.EndConnect(ar); - m_bAvailable = true; + Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IAsyncResult ar = socket.BeginConnect(m_EndPoint, callback, socket); + ar.AsyncWaitHandle.WaitOne(timeOut * 1000, false); } - catch (Exception) + catch (Exception e) + { + m_log.DebugFormat("CheckRegion Socket Setup exception: {0}:{1}", e.Message, e.StackTrace); + return false; + } + + if (timed_out) { + m_log.DebugFormat("socket [{0}] timed out ({1}) waiting to obtain a connection.", m_EndPoint, timeOut * 1000); + + if (retry) + { + return CheckRegion(address, port, false); + } } - socket.Close(); + + return available; + } + + public bool CheckRegion(string address, uint port) + { + return CheckRegion(address, port, true); } public void NoteDeadRegion(ulong regionhandle) diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index b35e60f..cb37faf 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -580,8 +580,7 @@ namespace OpenSim.Region.Environment.Scenes if (reg.RemotingAddress != "" && reg.RemotingPort != 0) { // region is remote. see if it is up - m_commsProvider.InterRegion.CheckRegion(reg.RemotingAddress, reg.RemotingPort); - destRegionUp = m_commsProvider.InterRegion.Available; + destRegionUp = m_commsProvider.InterRegion.CheckRegion(reg.RemotingAddress, reg.RemotingPort); } else { -- cgit v1.1