diff options
author | Justin Clark-Casey (justincc) | 2012-05-24 00:31:14 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-05-24 00:31:14 +0100 |
commit | 459c7635afdbc4002cacbf5780185645a4296f6a (patch) | |
tree | 9cf90fb39bc20e9283d6702d102475db08ca53d3 /OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |
parent | Environment Module - allows Environment settings for Viewer3 warning: include... (diff) | |
download | opensim-SC_OLD-459c7635afdbc4002cacbf5780185645a4296f6a.zip opensim-SC_OLD-459c7635afdbc4002cacbf5780185645a4296f6a.tar.gz opensim-SC_OLD-459c7635afdbc4002cacbf5780185645a4296f6a.tar.bz2 opensim-SC_OLD-459c7635afdbc4002cacbf5780185645a4296f6a.tar.xz |
If an agent is still registered as 'in transit' by the source region, don't allow an immediate teleport back.
This is to help relieve a race condition when an agent teleports then immediately attempts to teleport back before the source region has properly cleaned up/demoted the old ScenePresence.
This is rare in viewers but much more possible via scripting or region module.
However, more needs to be done since virtually all clean up happens after the transit flag is cleared .
Possibly need to add a 'cleaning up' state to in transit.
This change required making the EntityTransferModule and HGEntityTransferModule per-region rather than shared, in order to allow separate transit lists.
Changes were also required in LocalSimulationConnector.
Tested in standalone, grid and with local and remote region crossings with attachments.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | 69 |
1 files changed, 30 insertions, 39 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 36e9da6..408d63d 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -46,7 +46,7 @@ using Nini.Config; | |||
46 | 46 | ||
47 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | 47 | namespace OpenSim.Region.CoreModules.Framework.EntityTransfer |
48 | { | 48 | { |
49 | public class EntityTransferModule : ISharedRegionModule, IEntityTransferModule | 49 | public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule |
50 | { | 50 | { |
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
52 | 52 | ||
@@ -65,9 +65,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
65 | public bool EnableWaitForCallbackFromTeleportDest { get; set; } | 65 | public bool EnableWaitForCallbackFromTeleportDest { get; set; } |
66 | 66 | ||
67 | protected bool m_Enabled = false; | 67 | protected bool m_Enabled = false; |
68 | protected Scene m_aScene; | 68 | |
69 | protected List<Scene> m_Scenes = new List<Scene>(); | 69 | protected Scene m_scene; |
70 | |||
70 | protected List<UUID> m_agentsInTransit; | 71 | protected List<UUID> m_agentsInTransit; |
72 | |||
71 | private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions = | 73 | private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions = |
72 | new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>(); | 74 | new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>(); |
73 | 75 | ||
@@ -129,10 +131,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
129 | if (!m_Enabled) | 131 | if (!m_Enabled) |
130 | return; | 132 | return; |
131 | 133 | ||
132 | if (m_aScene == null) | 134 | m_scene = scene; |
133 | m_aScene = scene; | ||
134 | 135 | ||
135 | m_Scenes.Add(scene); | ||
136 | scene.RegisterModuleInterface<IEntityTransferModule>(this); | 136 | scene.RegisterModuleInterface<IEntityTransferModule>(this); |
137 | scene.EventManager.OnNewClient += OnNewClient; | 137 | scene.EventManager.OnNewClient += OnNewClient; |
138 | } | 138 | } |
@@ -143,27 +143,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
143 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; | 143 | client.OnTeleportLandmarkRequest += RequestTeleportLandmark; |
144 | } | 144 | } |
145 | 145 | ||
146 | public virtual void Close() | 146 | public virtual void Close() {} |
147 | { | ||
148 | if (!m_Enabled) | ||
149 | return; | ||
150 | } | ||
151 | 147 | ||
152 | public virtual void RemoveRegion(Scene scene) | 148 | public virtual void RemoveRegion(Scene scene) {} |
153 | { | ||
154 | if (!m_Enabled) | ||
155 | return; | ||
156 | if (scene == m_aScene) | ||
157 | m_aScene = null; | ||
158 | 149 | ||
159 | m_Scenes.Remove(scene); | 150 | public virtual void RegionLoaded(Scene scene) {} |
160 | } | ||
161 | |||
162 | public virtual void RegionLoaded(Scene scene) | ||
163 | { | ||
164 | if (!m_Enabled) | ||
165 | return; | ||
166 | } | ||
167 | 151 | ||
168 | #endregion | 152 | #endregion |
169 | 153 | ||
@@ -294,7 +278,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
294 | { | 278 | { |
295 | uint x = 0, y = 0; | 279 | uint x = 0, y = 0; |
296 | Utils.LongToUInts(regionHandle, out x, out y); | 280 | Utils.LongToUInts(regionHandle, out x, out y); |
297 | GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); | 281 | GridRegion reg = m_scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); |
298 | 282 | ||
299 | if (reg != null) | 283 | if (reg != null) |
300 | { | 284 | { |
@@ -441,7 +425,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
441 | 425 | ||
442 | string reason; | 426 | string reason; |
443 | string version; | 427 | string version; |
444 | if (!m_aScene.SimulationService.QueryAccess( | 428 | if (!m_scene.SimulationService.QueryAccess( |
445 | finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) | 429 | finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) |
446 | { | 430 | { |
447 | sp.ControllingClient.SendTeleportFailed(reason); | 431 | sp.ControllingClient.SendTeleportFailed(reason); |
@@ -660,7 +644,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
660 | EnableChildAgents(sp); | 644 | EnableChildAgents(sp); |
661 | 645 | ||
662 | // Finally, kill the agent we just created at the destination. | 646 | // Finally, kill the agent we just created at the destination. |
663 | m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); | 647 | m_scene.SimulationService.CloseAgent(finalDestination, sp.UUID); |
664 | 648 | ||
665 | sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); | 649 | sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); |
666 | } | 650 | } |
@@ -668,7 +652,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
668 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) | 652 | protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) |
669 | { | 653 | { |
670 | logout = false; | 654 | logout = false; |
671 | bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); | 655 | bool success = m_scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); |
672 | 656 | ||
673 | if (success) | 657 | if (success) |
674 | sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); | 658 | sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); |
@@ -678,7 +662,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
678 | 662 | ||
679 | protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) | 663 | protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) |
680 | { | 664 | { |
681 | return m_aScene.SimulationService.UpdateAgent(finalDestination, agent); | 665 | return m_scene.SimulationService.UpdateAgent(finalDestination, agent); |
682 | } | 666 | } |
683 | 667 | ||
684 | protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) | 668 | protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) |
@@ -730,7 +714,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
730 | return false; | 714 | return false; |
731 | } | 715 | } |
732 | 716 | ||
733 | |||
734 | #endregion | 717 | #endregion |
735 | 718 | ||
736 | #region Landmark Teleport | 719 | #region Landmark Teleport |
@@ -742,7 +725,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
742 | /// <param name="position"></param> | 725 | /// <param name="position"></param> |
743 | public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) | 726 | public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) |
744 | { | 727 | { |
745 | GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); | 728 | GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); |
746 | 729 | ||
747 | if (info == null) | 730 | if (info == null) |
748 | { | 731 | { |
@@ -763,12 +746,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
763 | m_log.DebugFormat( | 746 | m_log.DebugFormat( |
764 | "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); | 747 | "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); |
765 | 748 | ||
766 | //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); | 749 | //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_scene.PresenceService.GetAgent(client.SessionId); |
767 | GridUserInfo uinfo = m_aScene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); | 750 | GridUserInfo uinfo = m_scene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); |
768 | 751 | ||
769 | if (uinfo != null) | 752 | if (uinfo != null) |
770 | { | 753 | { |
771 | GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); | 754 | GridRegion regionInfo = m_scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); |
772 | if (regionInfo == null) | 755 | if (regionInfo == null) |
773 | { | 756 | { |
774 | // can't find the Home region: Tell viewer and abort | 757 | // can't find the Home region: Tell viewer and abort |
@@ -1625,7 +1608,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1625 | #region Agent Arrived | 1608 | #region Agent Arrived |
1626 | public void AgentArrivedAtDestination(UUID id) | 1609 | public void AgentArrivedAtDestination(UUID id) |
1627 | { | 1610 | { |
1628 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Agent {0} released", id); | ||
1629 | ResetFromTransit(id); | 1611 | ResetFromTransit(id); |
1630 | } | 1612 | } |
1631 | 1613 | ||
@@ -1896,8 +1878,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1896 | //// And the new channel... | 1878 | //// And the new channel... |
1897 | //if (m_interregionCommsOut != null) | 1879 | //if (m_interregionCommsOut != null) |
1898 | // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); | 1880 | // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); |
1899 | if (m_aScene.SimulationService != null) | 1881 | if (m_scene.SimulationService != null) |
1900 | successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true); | 1882 | successYN = m_scene.SimulationService.CreateObject(destination, newPosition, grp, true); |
1901 | 1883 | ||
1902 | if (successYN) | 1884 | if (successYN) |
1903 | { | 1885 | { |
@@ -2004,7 +1986,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2004 | /// </summary> | 1986 | /// </summary> |
2005 | /// <returns>true if the agent is in the process of being teleported, false otherwise.</returns> | 1987 | /// <returns>true if the agent is in the process of being teleported, false otherwise.</returns> |
2006 | /// <param name='id'>The agent ID</para></param> | 1988 | /// <param name='id'>The agent ID</para></param> |
2007 | protected bool IsInTransit(UUID id) | 1989 | public bool IsInTransit(UUID id) |
2008 | { | 1990 | { |
2009 | lock (m_agentsInTransit) | 1991 | lock (m_agentsInTransit) |
2010 | return m_agentsInTransit.Contains(id); | 1992 | return m_agentsInTransit.Contains(id); |
@@ -2024,10 +2006,19 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
2024 | if (m_agentsInTransit.Contains(id)) | 2006 | if (m_agentsInTransit.Contains(id)) |
2025 | { | 2007 | { |
2026 | m_agentsInTransit.Remove(id); | 2008 | m_agentsInTransit.Remove(id); |
2009 | |||
2010 | m_log.DebugFormat( | ||
2011 | "[ENTITY TRANSFER MODULE]: Agent {0} cleared from transit in {1}", | ||
2012 | id, m_scene.RegionInfo.RegionName); | ||
2013 | |||
2027 | return true; | 2014 | return true; |
2028 | } | 2015 | } |
2029 | } | 2016 | } |
2030 | 2017 | ||
2018 | m_log.WarnFormat( | ||
2019 | "[ENTITY TRANSFER MODULE]: Agent {0} requested to clear from transit in {1} but was already cleared.", | ||
2020 | id, m_scene.RegionInfo.RegionName); | ||
2021 | |||
2031 | return false; | 2022 | return false; |
2032 | } | 2023 | } |
2033 | 2024 | ||