diff options
author | UbitUmarov | 2014-09-13 20:37:20 +0100 |
---|---|---|
committer | UbitUmarov | 2014-09-13 20:37:20 +0100 |
commit | 908e0e1cef792456fc1ba6394ff9119110870dc4 (patch) | |
tree | 54b8834cd0486c6a92bcb4d4d2aa7385bf6aeb5a /OpenSim/Region | |
parent | If a client's SceneAgent is null, that client is not fully logged in or (diff) | |
download | opensim-SC-908e0e1cef792456fc1ba6394ff9119110870dc4.zip opensim-SC-908e0e1cef792456fc1ba6394ff9119110870dc4.tar.gz opensim-SC-908e0e1cef792456fc1ba6394ff9119110870dc4.tar.bz2 opensim-SC-908e0e1cef792456fc1ba6394ff9119110870dc4.tar.xz |
do not use a blind expire of m_pendingCache. Entries must be valid while
respective HandleUseCircuitCode, no matter how long it takes, so a viewer
retry doesnt start a overlapping one. It HandleUseCircuitCode
responsability to always remove entries, even on fails. Remove a client
even if m_scene.CloseAgent fails.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index 5ce82a5..18d5606 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | |||
@@ -308,8 +308,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
308 | 308 | ||
309 | 309 | ||
310 | 310 | ||
311 | private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>(); | 311 | // private ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new ExpiringCache<IPEndPoint, Queue<UDPPacketBuffer>>(); |
312 | 312 | private Dictionary<IPEndPoint, Queue<UDPPacketBuffer>> m_pendingCache = new Dictionary<IPEndPoint, Queue<UDPPacketBuffer>>(); | |
313 | /// <summary> | 313 | /// <summary> |
314 | /// Event used to signal when queued packets are available for sending. | 314 | /// Event used to signal when queued packets are available for sending. |
315 | /// </summary> | 315 | /// </summary> |
@@ -1416,10 +1416,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1416 | // And if there is a UseCircuitCode pending, also drop it | 1416 | // And if there is a UseCircuitCode pending, also drop it |
1417 | lock (m_pendingCache) | 1417 | lock (m_pendingCache) |
1418 | { | 1418 | { |
1419 | if (m_pendingCache.Contains(endPoint)) | 1419 | // if (m_pendingCache.Contains(endPoint)) |
1420 | if (m_pendingCache.ContainsKey(endPoint)) | ||
1420 | return; | 1421 | return; |
1421 | 1422 | ||
1422 | m_pendingCache.AddOrUpdate(endPoint, new Queue<UDPPacketBuffer>(), 60); | 1423 | // m_pendingCache.AddOrUpdate(endPoint, new Queue<UDPPacketBuffer>(), 60); |
1424 | m_pendingCache.Add(endPoint, new Queue<UDPPacketBuffer>()); | ||
1423 | } | 1425 | } |
1424 | 1426 | ||
1425 | // We need to copy the endpoint so that it doesn't get changed when another thread reuses the | 1427 | // We need to copy the endpoint so that it doesn't get changed when another thread reuses the |
@@ -1765,10 +1767,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1765 | uccp.CircuitCode.SessionID, | 1767 | uccp.CircuitCode.SessionID, |
1766 | endPoint, | 1768 | endPoint, |
1767 | sessionInfo); | 1769 | sessionInfo); |
1768 | 1770 | ||
1769 | // Now we know we can handle more data | ||
1770 | Thread.Sleep(200); | ||
1771 | |||
1772 | // Obtain the pending queue and remove it from the cache | 1771 | // Obtain the pending queue and remove it from the cache |
1773 | Queue<UDPPacketBuffer> queue = null; | 1772 | Queue<UDPPacketBuffer> queue = null; |
1774 | 1773 | ||
@@ -1786,13 +1785,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1786 | m_log.DebugFormat("[LLUDPSERVER]: Client created, processing pending queue, {0} entries", queue.Count); | 1785 | m_log.DebugFormat("[LLUDPSERVER]: Client created, processing pending queue, {0} entries", queue.Count); |
1787 | 1786 | ||
1788 | // Reinject queued packets | 1787 | // Reinject queued packets |
1789 | while (queue.Count > 0) | 1788 | if (queue != null) |
1790 | { | 1789 | { |
1791 | UDPPacketBuffer buf = queue.Dequeue(); | 1790 | while (queue.Count > 0) |
1792 | PacketReceived(buf); | 1791 | { |
1793 | } | 1792 | UDPPacketBuffer buf = queue.Dequeue(); |
1793 | PacketReceived(buf); | ||
1794 | } | ||
1794 | 1795 | ||
1795 | queue = null; | 1796 | queue = null; |
1797 | } | ||
1796 | 1798 | ||
1797 | // Send ack straight away to let the viewer know that the connection is active. | 1799 | // Send ack straight away to let the viewer know that the connection is active. |
1798 | // The client will be null if it already exists (e.g. if on a region crossing the client sends a use | 1800 | // The client will be null if it already exists (e.g. if on a region crossing the client sends a use |
@@ -1815,6 +1817,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1815 | m_log.WarnFormat( | 1817 | m_log.WarnFormat( |
1816 | "[LLUDPSERVER]: Ignoring connection request for {0} to {1} with unknown circuit code {2} from IP {3}", | 1818 | "[LLUDPSERVER]: Ignoring connection request for {0} to {1} with unknown circuit code {2} from IP {3}", |
1817 | uccp.CircuitCode.ID, m_scene.RegionInfo.RegionName, uccp.CircuitCode.Code, endPoint); | 1819 | uccp.CircuitCode.ID, m_scene.RegionInfo.RegionName, uccp.CircuitCode.Code, endPoint); |
1820 | |||
1818 | lock (m_pendingCache) | 1821 | lock (m_pendingCache) |
1819 | m_pendingCache.Remove(endPoint); | 1822 | m_pendingCache.Remove(endPoint); |
1820 | } | 1823 | } |
@@ -1825,6 +1828,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
1825 | } | 1828 | } |
1826 | catch (Exception e) | 1829 | catch (Exception e) |
1827 | { | 1830 | { |
1831 | // this may already be done.. or not.. | ||
1832 | lock (m_pendingCache) | ||
1833 | m_pendingCache.Remove(endPoint); | ||
1834 | |||
1828 | m_log.ErrorFormat( | 1835 | m_log.ErrorFormat( |
1829 | "[LLUDPSERVER]: UseCircuitCode handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}", | 1836 | "[LLUDPSERVER]: UseCircuitCode handling from endpoint {0}, client {1} {2} failed. Exception {3}{4}", |
1830 | endPoint != null ? endPoint.ToString() : "n/a", | 1837 | endPoint != null ? endPoint.ToString() : "n/a", |
@@ -2058,11 +2065,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2058 | "[LLUDPSERVER]: No packets received from {0} agent of {1} for {2}ms in {3}. Disconnecting.", | 2065 | "[LLUDPSERVER]: No packets received from {0} agent of {1} for {2}ms in {3}. Disconnecting.", |
2059 | client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, timeoutTicks, m_scene.Name); | 2066 | client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, timeoutTicks, m_scene.Name); |
2060 | 2067 | ||
2061 | if (!client.SceneAgent.IsChildAgent) | 2068 | if (client.SceneAgent != null && !client.SceneAgent.IsChildAgent) |
2062 | client.Kick("Simulator logged you out due to connection timeout."); | 2069 | client.Kick("Simulator logged you out due to connection timeout."); |
2063 | } | 2070 | } |
2064 | 2071 | ||
2065 | m_scene.CloseAgent(client.AgentId, true); | 2072 | if (!m_scene.CloseAgent(client.AgentId, true)) |
2073 | client.Close(true,true); | ||
2066 | } | 2074 | } |
2067 | 2075 | ||
2068 | private void IncomingPacketHandler() | 2076 | private void IncomingPacketHandler() |