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()varregion
parent
b704de9bf8
commit
b16bc7b01c
OpenSim
Framework
Region
Application
ClientStack/Linden
Caps/EventQueue/Tests
UDP
CoreModules
Avatar
Attachments/Tests
Gods
Framework/EntityTransfer
ServiceConnectorsOut/Simulation
World/Estate
Framework/Scenes
OptionalModules/World/NPC
ScriptEngine/Shared/Api/Implementation
|
@ -86,7 +86,7 @@ namespace OpenSim.Framework
|
|||
event restart OnRestart;
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
|
@ -96,14 +96,16 @@ namespace OpenSim.Framework
|
|||
ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
|
||||
|
||||
/// <summary>
|
||||
/// Remove the given client from the scene.
|
||||
/// Tell a single agent to disconnect from the region.
|
||||
/// </summary>
|
||||
/// <param name="agentID"></param>
|
||||
/// <param name="closeChildAgents">Close the neighbour child agents associated with this client.</param>
|
||||
void RemoveClient(UUID agentID, bool closeChildAgents);
|
||||
/// <param name="force">
|
||||
/// 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.
|
||||
/// </param>
|
||||
bool CloseAgent(UUID agentID, bool force);
|
||||
|
||||
void Restart();
|
||||
//RegionInfo OtherRegionUp(RegionInfo thisRegion);
|
||||
|
||||
string GetSimulatorVersion();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,9 +60,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
|
|||
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; }
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|||
/// <param name='closeChildAgents'>
|
||||
/// Close the neighbour child agents associated with this client.
|
||||
/// </param>
|
||||
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
|
|||
/// <param name="force"></param>
|
||||
/// <param name="auth_token"></param>
|
||||
/// <returns></returns>
|
||||
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
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tell a single agent to prepare to close.
|
||||
/// Tell a single client to prepare to close.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 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().
|
||||
/// </remarks>
|
||||
/// <param name="sp"></param>
|
||||
/// <returns>true if pre-close state notification was successful. false if the agent
|
||||
/// was not in a state where it could transition to pre-close.</returns>
|
||||
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.
|
||||
/// </param>
|
||||
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;
|
||||
|
|
|
@ -218,19 +218,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
|
||||
|
||||
/// <summary>
|
||||
/// Remove the given client from the scene.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 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).
|
||||
/// </remarks>
|
||||
/// <param name='agentID'>ID of agent to close</param>
|
||||
/// <param name='closeChildAgents'>
|
||||
/// Close the neighbour child agents associated with this client.
|
||||
/// </param>
|
||||
public abstract void RemoveClient(UUID agentID, bool closeChildAgents);
|
||||
public abstract bool CloseAgent(UUID agentID, bool force);
|
||||
|
||||
public bool TryGetScenePresence(UUID agentID, out object scenePresence)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue