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(-)
(limited to 'OpenSim')
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