From 8c74cf775895276e485f82b04c23099db09dc682 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Tue, 25 Mar 2008 18:47:14 +0000 Subject: * Tear down CAPS and http handlers when an agent leaves a region (via crossing, teleport or logout) --- OpenSim/Region/Environment/Scenes/Scene.cs | 33 +++++++++++++++++----- .../Scenes/SceneCommunicationService.cs | 11 +++++++- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 15 ++++++++-- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 951e467..f02f038 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1498,11 +1498,7 @@ namespace OpenSim.Region.Environment.Scenes } m_sceneGridService.SendCloseChildAgentConnections(agentID, childknownRegions); - if (m_capsHandlers.ContainsKey(agentID)) - { - m_capsHandlers[agentID].DeregisterHandlers(); - m_capsHandlers.Remove(agentID); - } + RemoveCapsHandler(agentID); } m_eventManager.TriggerClientClosed(agentID); @@ -1717,8 +1713,8 @@ namespace OpenSim.Region.Environment.Scenes String capsObjectPath = GetCapsPath(agentId); m_log.DebugFormat( - "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} at {1} in {2}", - agentId, capsObjectPath, RegionInfo.RegionName); + "[CONNECTION DEBUGGING]: Setting up CAPS handler for avatar {0} in {1}", + agentId, RegionInfo.RegionName); Caps cap = new Caps(AssetCache, m_httpListener, m_regInfo.ExternalHostName, m_httpListener.Port, @@ -1735,6 +1731,29 @@ namespace OpenSim.Region.Environment.Scenes } /// + /// Remove the caps handler for a given agent. + /// + /// + public void RemoveCapsHandler(LLUUID agentId) + { + if (m_capsHandlers.ContainsKey(agentId)) + { + m_log.DebugFormat( + "[CONNECTION DEBUGGING]: Removing CAPS handler for root agent {0} in {1}", + agentId, RegionInfo.RegionName); + + m_capsHandlers[agentId].DeregisterHandlers(); + m_capsHandlers.Remove(agentId); + } + else + { + m_log.WarnFormat( + "[CONNECTION DEBUGGING]: Received request to remove CAPS handler for root agent {0} in {1}, but no such CAPS handler found!", + agentId, RegionInfo.RegionName); + } + } + + /// /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs index f2b2f20..318b04a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs +++ b/OpenSim/Region/Environment/Scenes/SceneCommunicationService.cs @@ -547,6 +547,12 @@ namespace OpenSim.Region.Environment.Scenes if(destRegionUp) { avatar.Close(); + + // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport + // failure at this point (unlike a border crossing failure). So perhaps this can never fail + // once we reach here... + avatar.Scene.RemoveCapsHandler(avatar.UUID); + m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent); m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId, position, false); @@ -555,7 +561,10 @@ namespace OpenSim.Region.Environment.Scenes // TODO Should construct this behind a method string capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort - + "/CAPS/" + circuitdata.CapsPath + "0000/"; + + "/CAPS/" + circuitdata.CapsPath + "0000/"; + + m_log.DebugFormat( + "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, avatar.UUID); avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4), capsPath); diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index df43490..8f9cbbf 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -1618,12 +1618,17 @@ namespace OpenSim.Region.Environment.Scenes ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle); if (neighbourRegion != null) - { + { + // When the neighbour is informed of the border crossing, it will set up CAPS handlers for the avatar + // This means we need to remove the current caps handler here and possibly compensate later, + // in case both scenes are being hosted on the same region server. Messy + m_scene.RemoveCapsHandler(UUID); + bool res = m_scene.InformNeighbourOfCrossing(neighbourHandle, m_controllingClient.AgentId, newpos, m_physicsActor.Flying); if (res) - { + { AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); // TODO Should construct this behind a method @@ -1632,7 +1637,7 @@ namespace OpenSim.Region.Environment.Scenes + "/CAPS/" + circuitdata.CapsPath + "0000/"; m_log.DebugFormat( - "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid); + "[CONNECTION DEBUGGING]: Sending new CAPS seed url {0} to avatar {1}", capsPath, m_uuid); m_controllingClient.CrossRegion(neighbourHandle, newpos, vel, neighbourRegion.ExternalEndPoint, capsPath); @@ -1640,6 +1645,10 @@ namespace OpenSim.Region.Environment.Scenes m_scene.SendKillObject(m_localId); m_scene.NotifyMyCoarseLocationChange(); } + else + { + m_scene.AddCapsHandler(UUID); + } } } -- cgit v1.1