aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs37
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs3
2 files changed, 29 insertions, 11 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index a130ffe..9504f15 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1692,6 +1692,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1692 endPoint = (IPEndPoint)array[0]; 1692 endPoint = (IPEndPoint)array[0];
1693 CompleteAgentMovementPacket packet = (CompleteAgentMovementPacket)array[1]; 1693 CompleteAgentMovementPacket packet = (CompleteAgentMovementPacket)array[1];
1694 1694
1695 m_log.DebugFormat(
1696 "[LLUDPSERVER]: Handling CompleteAgentMovement request from {0} in {1}", endPoint, m_scene.Name);
1697
1695 // Determine which agent this packet came from 1698 // Determine which agent this packet came from
1696 // We need to wait here because in when using the OpenSimulator V2 teleport protocol to travel to a destination 1699 // We need to wait here because in when using the OpenSimulator V2 teleport protocol to travel to a destination
1697 // simulator with no existing child presence, the viewer (at least LL 3.3.4) will send UseCircuitCode 1700 // simulator with no existing child presence, the viewer (at least LL 3.3.4) will send UseCircuitCode
@@ -1703,24 +1706,36 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1703 { 1706 {
1704 if (m_scene.TryGetClient(endPoint, out client)) 1707 if (m_scene.TryGetClient(endPoint, out client))
1705 { 1708 {
1706 if (client.IsActive) 1709 if (!client.IsActive)
1707 {
1708 break;
1709 }
1710 else
1711 { 1710 {
1712 // This check exists to catch a condition where the client has been closed by another thread 1711 // This check exists to catch a condition where the client has been closed by another thread
1713 // but has not yet been removed from the client manager (and possibly a new connection has 1712 // but has not yet been removed from the client manager (and possibly a new connection has
1714 // not yet been established). 1713 // not yet been established).
1715 m_log.DebugFormat( 1714 m_log.DebugFormat(
1716 "[LLUDPSERVER]: Received a CompleteMovementIntoRegion from {0} for {1} in {2} but client is not active. Waiting.", 1715 "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client is not active yet. Waiting.",
1716 endPoint, client.Name, m_scene.Name);
1717 }
1718 else if (client.SceneAgent == null)
1719 {
1720 // This check exists to catch a condition where the new client has been added to the client
1721 // manager but the SceneAgent has not yet been set in Scene.AddNewClient(). If we are too
1722 // eager, then the new ScenePresence may not have registered a listener for this messsage
1723 // before we try to process it.
1724 // XXX: A better long term fix may be to add the SceneAgent before the client is added to
1725 // the client manager
1726 m_log.DebugFormat(
1727 "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client SceneAgent not set yet. Waiting.",
1717 endPoint, client.Name, m_scene.Name); 1728 endPoint, client.Name, m_scene.Name);
1718 } 1729 }
1730 else
1731 {
1732 break;
1733 }
1719 } 1734 }
1720 else 1735 else
1721 { 1736 {
1722 m_log.DebugFormat( 1737 m_log.DebugFormat(
1723 "[LLUDPSERVER]: Received a CompleteMovementIntoRegion from {0} in {1} but no client exists. Waiting.", 1738 "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} in {1} but no client exists yet. Waiting.",
1724 endPoint, m_scene.Name); 1739 endPoint, m_scene.Name);
1725 } 1740 }
1726 1741
@@ -1730,19 +1745,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1730 if (client == null) 1745 if (client == null)
1731 { 1746 {
1732 m_log.DebugFormat( 1747 m_log.DebugFormat(
1733 "[LLUDPSERVER]: No client found for CompleteMovementIntoRegion from {0} in {1} after wait. Dropping.", 1748 "[LLUDPSERVER]: No client found for CompleteAgentMovement from {0} in {1} after wait. Dropping.",
1734 endPoint, m_scene.Name); 1749 endPoint, m_scene.Name);
1735 1750
1736 return; 1751 return;
1737 } 1752 }
1738 else if (!client.IsActive) 1753 else if (!client.IsActive || client.SceneAgent == null)
1739 { 1754 {
1740 // This check exists to catch a condition where the client has been closed by another thread 1755 // This check exists to catch a condition where the client has been closed by another thread
1741 // but has not yet been removed from the client manager. 1756 // but has not yet been removed from the client manager.
1742 // The packet could be simply ignored but it is useful to know if this condition occurred for other debugging 1757 // The packet could be simply ignored but it is useful to know if this condition occurred for other debugging
1743 // purposes. 1758 // purposes.
1744 m_log.DebugFormat( 1759 m_log.DebugFormat(
1745 "[LLUDPSERVER]: Received a CompleteMovementIntoRegion from {0} for {1} in {2} but client is not active after wait. Dropping.", 1760 "[LLUDPSERVER]: Received a CompleteAgentMovement from {0} for {1} in {2} but client is not active after wait. Dropping.",
1746 endPoint, client.Name, m_scene.Name); 1761 endPoint, client.Name, m_scene.Name);
1747 1762
1748 return; 1763 return;
@@ -1767,7 +1782,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1767 catch (Exception e) 1782 catch (Exception e)
1768 { 1783 {
1769 m_log.ErrorFormat( 1784 m_log.ErrorFormat(
1770 "[LLUDPSERVER]: CompleteMovementIntoRegion handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}", 1785 "[LLUDPSERVER]: CompleteAgentMovement handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}",
1771 endPoint != null ? endPoint.ToString() : "n/a", 1786 endPoint != null ? endPoint.ToString() : "n/a",
1772 client != null ? client.Name : "unknown", 1787 client != null ? client.Name : "unknown",
1773 client != null ? client.AgentId.ToString() : "unknown", 1788 client != null ? client.AgentId.ToString() : "unknown",
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index bc5a67f..3dc509b 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2863,6 +2863,9 @@ namespace OpenSim.Region.Framework.Scenes
2863 2863
2864 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the 2864 // We must set this here so that TriggerOnNewClient and TriggerOnClientLogin can determine whether the
2865 // client is for a root or child agent. 2865 // client is for a root or child agent.
2866 // XXX: This may be better set for a new client before that client is added to the client manager.
2867 // But need to know what happens in the case where a ScenePresence is already present (and if this
2868 // actually occurs).
2866 client.SceneAgent = sp; 2869 client.SceneAgent = sp;
2867 2870
2868 // This is currently also being done earlier in NewUserConnection for real users to see if this 2871 // This is currently also being done earlier in NewUserConnection for real users to see if this