diff options
author | John Hurliman | 2009-10-25 00:40:21 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-25 00:40:21 -0700 |
commit | 730930955a7edc0bfa69ff1cac93acd024cf8d24 (patch) | |
tree | ae38c7d82245acdc4499d9b39a227eba541132bb /OpenSim/Region/ClientStack | |
parent | * Changed various modules to not initialize timers unless the module is initi... (diff) | |
download | opensim-SC_OLD-730930955a7edc0bfa69ff1cac93acd024cf8d24.zip opensim-SC_OLD-730930955a7edc0bfa69ff1cac93acd024cf8d24.tar.gz opensim-SC_OLD-730930955a7edc0bfa69ff1cac93acd024cf8d24.tar.bz2 opensim-SC_OLD-730930955a7edc0bfa69ff1cac93acd024cf8d24.tar.xz |
Changing Scene.ForEachClient to use the synchronous for loop instead of Parallel. This is quite possibly the source of some deadlocking, and at the very least the synchronous version gives better stack traces
* Lock the LLUDPClient RTO math * Add a helper function for backing off the RTO, and follow the optional advice in RFC 2988 to clear existing SRTT and RTTVAR values during a backoff
* Removing the unused PrimitiveBaseShape.SculptImage parameter * Improved performance of SceneObjectPart instantiation * ZeroMesher now drops SculptData bytes like Meshmerizer, to allow the texture data to be GCed * Improved typecasting speed in MySQLLegacyRegionData.BuildShape()
* Improved the instantiation of PrimitiveBaseShape
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 54 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 4 |
2 files changed, 42 insertions, 16 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index d2cd6d9..0948e1c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -144,6 +144,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; | 144 | private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; |
145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> | 145 | /// <summary>A reference to the LLUDPServer that is managing this client</summary> |
146 | private readonly LLUDPServer m_udpServer; | 146 | private readonly LLUDPServer m_udpServer; |
147 | /// <summary>Locks access to the variables used while calculating round-trip | ||
148 | /// packet times and the retransmission timeout</summary> | ||
149 | private readonly object m_roundTripCalcLock = new object(); | ||
147 | 150 | ||
148 | /// <summary> | 151 | /// <summary> |
149 | /// Default constructor | 152 | /// Default constructor |
@@ -484,29 +487,52 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
484 | const float BETA = 0.25f; | 487 | const float BETA = 0.25f; |
485 | const float K = 4.0f; | 488 | const float K = 4.0f; |
486 | 489 | ||
487 | if (RTTVAR == 0.0f) | 490 | lock (m_roundTripCalcLock) |
488 | { | 491 | { |
489 | // First RTT measurement | 492 | if (RTTVAR == 0.0f) |
490 | SRTT = r; | 493 | { |
491 | RTTVAR = r * 0.5f; | 494 | // First RTT measurement |
492 | } | 495 | SRTT = r; |
493 | else | 496 | RTTVAR = r * 0.5f; |
494 | { | 497 | } |
495 | // Subsequence RTT measurement | 498 | else |
496 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); | 499 | { |
497 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | 500 | // Subsequence RTT measurement |
498 | } | 501 | RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r); |
502 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | ||
503 | } | ||
499 | 504 | ||
500 | RTO = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); | 505 | int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); |
501 | 506 | ||
502 | // Clamp the retransmission timeout to manageable values | 507 | // Clamp the retransmission timeout to manageable values |
503 | RTO = Utils.Clamp(RTO, 3000, 60000); | 508 | rto = Utils.Clamp(RTO, 3000, 60000); |
509 | |||
510 | RTO = rto; | ||
511 | } | ||
504 | 512 | ||
505 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + | 513 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + |
506 | // RTTVAR + " based on new RTT of " + r + "ms"); | 514 | // RTTVAR + " based on new RTT of " + r + "ms"); |
507 | } | 515 | } |
508 | 516 | ||
509 | /// <summary> | 517 | /// <summary> |
518 | /// Exponential backoff of the retransmission timeout, per section 5.5 | ||
519 | /// of RFC 2988 | ||
520 | /// </summary> | ||
521 | public void BackoffRTO() | ||
522 | { | ||
523 | lock (m_roundTripCalcLock) | ||
524 | { | ||
525 | // Reset SRTT and RTTVAR, we assume they are bogus since things | ||
526 | // didn't work out and we're backing off the timeout | ||
527 | SRTT = 0.0f; | ||
528 | RTTVAR = 0.0f; | ||
529 | |||
530 | // Double the retransmission timeout | ||
531 | RTO = Math.Min(RTO * 2, 60000); | ||
532 | } | ||
533 | } | ||
534 | |||
535 | /// <summary> | ||
510 | /// Does an early check to see if this queue empty callback is already | 536 | /// Does an early check to see if this queue empty callback is already |
511 | /// running, then asynchronously firing the event | 537 | /// running, then asynchronously firing the event |
512 | /// </summary> | 538 | /// </summary> |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 1dd58bf..82ae640 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -431,8 +431,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
431 | { | 431 | { |
432 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); | 432 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); |
433 | 433 | ||
434 | // Backoff the RTO | 434 | // Exponential backoff of the retransmission timeout |
435 | udpClient.RTO = Math.Min(udpClient.RTO * 2, 60000); | 435 | udpClient.BackoffRTO(); |
436 | 436 | ||
437 | // Resend packets | 437 | // Resend packets |
438 | for (int i = 0; i < expiredPackets.Count; i++) | 438 | for (int i = 0; i < expiredPackets.Count; i++) |