From e6c0267def09280761a6f2cbc668b2d0ad7f2753 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 27 Sep 2013 19:14:21 +0100 Subject: [PATCH] refactor: rename Scene.IncomingCloseAgent() to CloseAgent() in order to make it clear that all non-clientstack callers should be using this rather than RemoveClient() in order to step through the ScenePresence state machine properly. Adds IScene.CloseAgent() to replace RemoveClient() --- OpenSim/Framework/IScene.cs | 12 +++++---- OpenSim/Region/Application/OpenSim.cs | 2 +- .../Caps/EventQueue/Tests/EventQueueTests.cs | 2 +- .../ClientStack/Linden/UDP/LLUDPServer.cs | 4 +-- .../ClientStack/Linden/UDP/Tests/MockScene.cs | 6 ++--- .../Tests/AttachmentsModuleTests.cs | 2 +- .../CoreModules/Avatar/Gods/GodsModule.cs | 2 +- .../EntityTransfer/EntityTransferModule.cs | 8 +++--- .../Simulation/LocalSimulationConnector.cs | 2 +- .../World/Estate/EstateManagementModule.cs | 6 ++--- OpenSim/Region/Framework/Scenes/Scene.cs | 26 +++++++++---------- OpenSim/Region/Framework/Scenes/SceneBase.cs | 14 +--------- .../Scenes/Tests/ScenePresenceAgentTests.cs | 4 +-- .../Tests/ScenePresenceCapabilityTests.cs | 2 +- .../OptionalModules/World/NPC/NPCModule.cs | 2 +- .../Shared/Api/Implementation/OSSL_Api.cs | 2 +- 16 files changed, 43 insertions(+), 53 deletions(-) diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index 8164f4198c..c3df37b8c8 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs @@ -86,7 +86,7 @@ namespace OpenSim.Framework event restart OnRestart; /// - /// Add a new client and create a presence for it. All clients except initial login clients will starts off as a child agent + /// Add a new agent. All agents except initial login clients will starts off as a child agent /// - the later agent crossing will promote it to a root agent. /// /// @@ -96,14 +96,16 @@ namespace OpenSim.Framework ISceneAgent AddNewClient(IClientAPI client, PresenceType type); /// - /// Remove the given client from the scene. + /// Tell a single agent to disconnect from the region. /// /// - /// Close the neighbour child agents associated with this client. - void RemoveClient(UUID agentID, bool closeChildAgents); + /// + /// Force the agent to close even if it might be in the middle of some other operation. You do not want to + /// force unless you are absolutely sure that the agent is dead and a normal close is not working. + /// + bool CloseAgent(UUID agentID, bool force); void Restart(); - //RegionInfo OtherRegionUp(RegionInfo thisRegion); string GetSimulatorVersion(); diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index a7fe226cbe..12250df656 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -452,7 +452,7 @@ namespace OpenSim else presence.ControllingClient.Kick("\nThe OpenSim manager kicked you out.\n"); - presence.Scene.IncomingCloseAgent(presence.UUID, force); + presence.Scene.CloseAgent(presence.UUID, force); break; } } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs index b3b0b8acc0..9e24bcef15 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/Tests/EventQueueTests.cs @@ -96,7 +96,7 @@ namespace OpenSim.Region.ClientStack.Linden.Tests UUID spId = TestHelpers.ParseTail(0x1); SceneHelpers.AddScenePresence(m_scene, spId); - m_scene.IncomingCloseAgent(spId, false); + m_scene.CloseAgent(spId, false); // TODO: Add more assertions for the other aspects of event queues Assert.That(MainServer.Instance.GetPollServiceHandlerKeys().Count, Is.EqualTo(0)); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 9504f15b28..5296a6d0d7 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -1893,7 +1893,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP client.Kick("Simulator logged you out due to connection timeout."); } - m_scene.IncomingCloseAgent(client.AgentId, true); + m_scene.CloseAgent(client.AgentId, true); } private void IncomingPacketHandler() @@ -2234,7 +2234,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (!client.IsLoggingOut) { client.IsLoggingOut = true; - m_scene.IncomingCloseAgent(client.AgentId, false); + m_scene.CloseAgent(client.AgentId, false); } } } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs index 119a677f80..28b5eb702f 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/MockScene.cs @@ -59,10 +59,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests // FIXME return null; } - - public override void RemoveClient(UUID agentID, bool someReason) {} -// public override void CloseAllAgents(uint circuitcode) {} + + public override bool CloseAgent(UUID agentID, bool force) { return true; } public override bool CheckClient(UUID clientId, IPEndPoint endPoint) { return true; } + public override void OtherRegionUp(GridRegion otherRegion) { } public override bool TryGetScenePresence(UUID uuid, out ScenePresence sp) { sp = null; return false; } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index fd493fcbb6..4e58045f27 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -719,7 +719,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests SceneObjectGroup rezzedAtt = presence.GetAttachments()[0]; m_numberOfAttachEventsFired = 0; - scene.IncomingCloseAgent(presence.UUID, false); + scene.CloseAgent(presence.UUID, false); // Check that we can't retrieve this attachment from the scene. Assert.That(scene.GetSceneObjectGroup(rezzedAtt.UUID), Is.Null); diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index 0cd495c5a4..3b6d970d4a 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs @@ -272,7 +272,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods if (sp.IsChildAgent) return; sp.ControllingClient.Kick(reason); - sp.Scene.IncomingCloseAgent(sp.UUID, true); + sp.Scene.CloseAgent(sp.UUID, true); } private void OnIncomingInstantMessage(GridInstantMessage msg) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 8ae81accb5..aa8a4db364 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -972,7 +972,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) { - if (!sp.Scene.IncomingPreCloseAgent(sp)) + if (!sp.Scene.IncomingPreCloseClient(sp)) return; // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before @@ -983,7 +983,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // an agent cannot teleport back to this region if it has teleported away. Thread.Sleep(2000); - sp.Scene.IncomingCloseAgent(sp.UUID, false); + sp.Scene.CloseAgent(sp.UUID, false); } else { @@ -1137,7 +1137,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) { - if (!sp.Scene.IncomingPreCloseAgent(sp)) + if (!sp.Scene.IncomingPreCloseClient(sp)) return; // RED ALERT!!!! @@ -1154,7 +1154,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Closing agent {0} in {1} after teleport", sp.Name, Scene.Name); - sp.Scene.IncomingCloseAgent(sp.UUID, false); + sp.Scene.CloseAgent(sp.UUID, false); } else { diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 5c098a8ecb..678f3dc3a5 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs @@ -311,7 +311,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation // "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", // s.RegionInfo.RegionName, destination.RegionHandle); - m_scenes[destination.RegionID].IncomingCloseAgent(id, false, auth_token); + m_scenes[destination.RegionID].CloseAgent(id, false, auth_token); return true; } diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 31547a69cb..42db1cf475 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -562,7 +562,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if (!Scene.TeleportClientHome(user, s.ControllingClient)) { s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); - Scene.IncomingCloseAgent(s.UUID, false); + Scene.CloseAgent(s.UUID, false); } } } @@ -797,7 +797,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if (!Scene.TeleportClientHome(prey, s.ControllingClient)) { s.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); - Scene.IncomingCloseAgent(s.UUID, false); + Scene.CloseAgent(s.UUID, false); } } } @@ -820,7 +820,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if (!Scene.TeleportClientHome(p.UUID, p.ControllingClient)) { p.ControllingClient.Kick("You were teleported home by the region owner, but the TP failed - you have been logged out."); - Scene.IncomingCloseAgent(p.UUID, false); + Scene.CloseAgent(p.UUID, false); } } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3dc509b728..82abfe9b1d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1313,7 +1313,7 @@ namespace OpenSim.Region.Framework.Scenes Thread.Sleep(500); // Stop all client threads. - ForEachScenePresence(delegate(ScenePresence avatar) { IncomingCloseAgent(avatar.UUID, false); }); + ForEachScenePresence(delegate(ScenePresence avatar) { CloseAgent(avatar.UUID, false); }); m_log.Debug("[SCENE]: Persisting changed objects"); EventManager.TriggerSceneShuttingDown(this); @@ -2976,7 +2976,7 @@ namespace OpenSim.Region.Framework.Scenes { PresenceService.LogoutAgent(sp.ControllingClient.SessionId); - IncomingCloseAgent(sp.UUID, false); + CloseAgent(sp.UUID, false); } else { @@ -3398,7 +3398,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Close the neighbour child agents associated with this client. /// - public override void RemoveClient(UUID agentID, bool closeChildAgents) + public void RemoveClient(UUID agentID, bool closeChildAgents) { AgentCircuitData acd = m_authenticateHandler.GetAgentCircuitData(agentID); @@ -3783,7 +3783,7 @@ namespace OpenSim.Region.Framework.Scenes sp.Name, sp.UUID, RegionInfo.RegionName); if (sp.ControllingClient != null) - IncomingCloseAgent(sp.UUID, true); + CloseAgent(sp.UUID, true); sp = null; } @@ -4424,7 +4424,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public bool IncomingCloseAgent(UUID agentID, bool force, string auth_token) + public bool CloseAgent(UUID agentID, bool force, string auth_token) { //m_log.DebugFormat("[SCENE]: Processing incoming close agent {0} in region {1} with auth_token {2}", agentID, RegionInfo.RegionName, auth_token); @@ -4442,7 +4442,7 @@ namespace OpenSim.Region.Framework.Scenes if (acd.SessionID.ToString() == auth_token) { - return IncomingCloseAgent(agentID, force); + return CloseAgent(agentID, force); } else { @@ -4455,16 +4455,16 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Tell a single agent to prepare to close. + /// Tell a single client to prepare to close. /// /// - /// This should only be called if we may close the agent but there will be some delay in so doing. Meant for - /// internal use - other callers should almost certainly called IncomingCloseAgent(). + /// This should only be called if we may close the client but there will be some delay in so doing. Meant for + /// internal use - other callers should almost certainly called CloseClient(). /// /// /// true if pre-close state notification was successful. false if the agent /// was not in a state where it could transition to pre-close. - public bool IncomingPreCloseAgent(ScenePresence sp) + public bool IncomingPreCloseClient(ScenePresence sp) { lock (m_removeClientLock) { @@ -4506,7 +4506,7 @@ namespace OpenSim.Region.Framework.Scenes /// Force the agent to close even if it might be in the middle of some other operation. You do not want to /// force unless you are absolutely sure that the agent is dead and a normal close is not working. /// - public bool IncomingCloseAgent(UUID agentID, bool force) + public override bool CloseAgent(UUID agentID, bool force) { ScenePresence sp; @@ -4517,7 +4517,7 @@ namespace OpenSim.Region.Framework.Scenes if (sp == null) { m_log.DebugFormat( - "[SCENE]: Called IncomingCloseAgent() with agent ID {0} but no such presence is in {1}", + "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}", agentID, Name); return false; @@ -4526,7 +4526,7 @@ namespace OpenSim.Region.Framework.Scenes if (sp.LifecycleState != ScenePresenceState.Running && sp.LifecycleState != ScenePresenceState.PreRemove) { m_log.DebugFormat( - "[SCENE]: Called IncomingCloseAgent() for {0} in {1} but presence is already in state {2}", + "[SCENE]: Called CloseClient() for {0} in {1} but presence is already in state {2}", sp.Name, Name, sp.LifecycleState); return false; diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index 5252b9638a..4b37983716 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -218,19 +218,7 @@ namespace OpenSim.Region.Framework.Scenes public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type); - /// - /// Remove the given client from the scene. - /// - /// - /// Only clientstack code should call this directly. All other code should call IncomingCloseAgent() instead - /// to properly operate the state machine and avoid race conditions with other close requests (such as directly - /// from viewers). - /// - /// ID of agent to close - /// - /// Close the neighbour child agents associated with this client. - /// - public abstract void RemoveClient(UUID agentID, bool closeChildAgents); + public abstract bool CloseAgent(UUID agentID, bool force); public bool TryGetScenePresence(UUID agentID, out object scenePresence) { diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs index bbe34d2b3d..e25bcb7349 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAgentTests.cs @@ -146,7 +146,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests } [Test] - public void TestCloseAgent() + public void TestCloseClient() { TestHelpers.InMethod(); // TestHelpers.EnableLogging(); @@ -154,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests TestScene scene = new SceneHelpers().SetupScene(); ScenePresence sp = SceneHelpers.AddScenePresence(scene, TestHelpers.ParseTail(0x1)); - scene.IncomingCloseAgent(sp.UUID, false); + scene.CloseAgent(sp.UUID, false); Assert.That(scene.GetScenePresence(sp.UUID), Is.Null); Assert.That(scene.AuthenticateHandler.GetAgentCircuitData(sp.UUID), Is.Null); diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs index b6fb730840..4fdfc74f35 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs @@ -79,7 +79,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests // TODO: Need to add tests for other ICapabiltiesModule methods. - scene.IncomingCloseAgent(sp.UUID, false); + scene.CloseAgent(sp.UUID, false); Assert.That(capsMod.GetCapsForUser(spUuid), Is.Null); // TODO: Need to add tests for other ICapabiltiesModule methods. diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index b86337075d..740f75ad66 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -384,7 +384,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC agentID, av.Name); */ - scene.IncomingCloseAgent(agentID, false); + scene.CloseAgent(agentID, false); m_avatars.Remove(agentID); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 415166a8c6..f4d5562364 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -2964,7 +2964,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api sp.ControllingClient.Kick(alert); // ...and close on our side - sp.Scene.IncomingCloseAgent(sp.UUID, false); + sp.Scene.CloseAgent(sp.UUID, false); } }); }