diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 046688fc11..a84443b6a9 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -555,7 +555,7 @@ namespace OpenSim.Framework void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, uint locationID, uint flags, string capsURL); - void SendTeleportFailed(); + void SendTeleportFailed(string reason); void SendTeleportLocationStart(); void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance); diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index 414c81ee33..f37ffc9a69 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -890,11 +890,11 @@ namespace OpenSim.Region.ClientStack /// /// /// - public void SendTeleportFailed() + public void SendTeleportFailed(string reason) { TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed); tpFailed.Info.AgentID = AgentId; - tpFailed.Info.Reason = Helpers.StringToField("unknown failure of teleport"); + tpFailed.Info.Reason = Helpers.StringToField(reason); OutPacket(tpFailed, ThrottleOutPacketType.Task); } diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index e3d10b5a94..78dca09778 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -594,28 +594,31 @@ namespace OpenSim.Region.Communications.OGS1 //don't want to be creating a new link to the remote instance every time like we are here bool retValue = false; - - OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting) Activator.GetObject( - typeof (OGS1InterRegionRemoting), - "tcp://" + regInfo.RemotingAddress + - ":" + regInfo.RemotingPort + - "/InterRegions"); - - if (remObject != null) + checkRegion(regInfo.RemotingAddress, regInfo.RemotingPort); + if (Available) { - retValue = remObject.InformRegionOfChildAgent(regionHandle, new sAgentCircuitData(agentData)); - } - else - { - Console.WriteLine("remoting object not found"); - } - remObject = null; - MainLog.Instance.Verbose("INTER", - gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " + - agentData.firstname + " " + agentData.lastname + " and got " + - retValue.ToString()); + OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( + typeof(OGS1InterRegionRemoting), + "tcp://" + regInfo.RemotingAddress + + ":" + regInfo.RemotingPort + + "/InterRegions"); - return retValue; + if (remObject != null) + { + retValue = remObject.InformRegionOfChildAgent(regionHandle, new sAgentCircuitData(agentData)); + } + else + { + Console.WriteLine("remoting object not found"); + } + remObject = null; + MainLog.Instance.Verbose("INTER", + gdebugRegionName + ": OGS1 tried to InformRegionOfChildAgent for " + + agentData.firstname + " " + agentData.lastname + " and got " + + retValue.ToString()); + + return retValue; + } } return false; @@ -1085,5 +1088,41 @@ namespace OpenSim.Region.Communications.OGS1 #endregion #endregion + + // helper to see if remote region is up + bool m_bAvailable = false; + int timeOut = 15000; //15 seconds + + public void checkRegion(string address, uint port) + { + IPAddress ia = null; + 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, false); + socket.Close(); + } + + public bool Available + { + get { return m_bAvailable; } + } + + void ConnectedMethod(IAsyncResult ar) + { + Socket socket = (Socket)ar.AsyncState; + try + { + socket.EndConnect(ar); + m_bAvailable = true; + } + catch (Exception) + { + } + socket.Close(); + } } + } \ No newline at end of file diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index ffe83270e3..640cb3bf08 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -420,11 +420,13 @@ namespace OpenSim.Region.Environment.Scenes agent.InventoryFolder = LLUUID.Zero; agent.startpos = position; agent.child = true; - avatar.Close(); - if (m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent) && - m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, - position, false)) ; + + + if(m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent)) { + avatar.Close(); + m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, + position, false); AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo(); string capsPath = Util.GetCapsURL(avatar.ControllingClient.AgentId); avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), @@ -443,6 +445,10 @@ namespace OpenSim.Region.Environment.Scenes CloseChildAgentConnections(avatar); } } + else + { + avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); + } } } } diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs index ecc2df440a..69060f18fc 100644 --- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs @@ -285,7 +285,7 @@ namespace SimpleApp { } - public virtual void SendTeleportFailed() + public virtual void SendTeleportFailed(string reason) { }