aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-07-19 00:51:13 +0100
committerDiva Canto2013-07-21 08:58:55 -0700
commit61eda1f441092eb12936472de2dc73898e40aa16 (patch)
tree946091464ce67628e7ec3a3e3ca49349085ae19e
parentAdd measure of number of inbound AgentUpdates that were seen as significant t... (diff)
downloadopensim-SC_OLD-61eda1f441092eb12936472de2dc73898e40aa16.zip
opensim-SC_OLD-61eda1f441092eb12936472de2dc73898e40aa16.tar.gz
opensim-SC_OLD-61eda1f441092eb12936472de2dc73898e40aa16.tar.bz2
opensim-SC_OLD-61eda1f441092eb12936472de2dc73898e40aa16.tar.xz
Make the check as to whether any particular inbound AgentUpdate packet is significant much earlier in UDP processing (i.e. before we pointlessly place such packets on internal queues, etc.)
Appears to have some impact on cpu but needs testing.
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs170
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs17
-rw-r--r--OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs4
3 files changed, 131 insertions, 60 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 3145275..7e5511f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -357,7 +357,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
357 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods 357 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods
358 /// cannot retain a reference to it outside of that method. 358 /// cannot retain a reference to it outside of that method.
359 /// </remarks> 359 /// </remarks>
360 private AgentUpdateArgs m_lastAgentUpdateArgs; 360 private AgentUpdateArgs m_lastAgentUpdateArgs = new AgentUpdateArgs();
361
362 private AgentUpdateArgs m_thisAgentUpdateArgs = new AgentUpdateArgs();
361 363
362 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); 364 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
363 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers 365 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
@@ -5569,80 +5571,136 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5569 5571
5570 #region Scene/Avatar 5572 #region Scene/Avatar
5571 5573
5574 /// <summary>
5575 /// This checks the update significance against the last update made.
5576 /// </summary>
5577 /// <remarks>Can only be called by one thread at a time, and not at the same time as </remarks>
5578 ///
5579 /// <returns>/returns>
5580 /// <param name='x'></param>
5581 public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5582 {
5583 bool update = false;
5584
5585 if (m_lastAgentUpdateArgs != null)
5586 {
5587 // These should be ordered from most-likely to
5588 // least likely to change. I've made an initial
5589 // guess at that.
5590 update =
5591 (
5592 (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) ||
5593 (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) ||
5594 (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) ||
5595 (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) ||
5596 (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) ||
5597 (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) ||
5598 (x.Far != m_lastAgentUpdateArgs.Far) ||
5599 (x.Flags != m_lastAgentUpdateArgs.Flags) ||
5600 (x.State != m_lastAgentUpdateArgs.State) ||
5601 (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) ||
5602 (x.SessionID != m_lastAgentUpdateArgs.SessionID) ||
5603 (x.AgentID != m_lastAgentUpdateArgs.AgentID)
5604 );
5605 }
5606 else
5607 {
5608 m_lastAgentUpdateArgs = new AgentUpdateArgs();
5609 update = true;
5610 }
5611
5612 if (update)
5613 {
5614// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name);
5615 TotalSignificantAgentUpdates++;
5616
5617 m_lastAgentUpdateArgs.AgentID = x.AgentID;
5618 m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation;
5619 m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
5620 m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter;
5621 m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
5622 m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
5623 m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags;
5624 m_lastAgentUpdateArgs.Far = x.Far;
5625 m_lastAgentUpdateArgs.Flags = x.Flags;
5626 m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation;
5627 m_lastAgentUpdateArgs.SessionID = x.SessionID;
5628 m_lastAgentUpdateArgs.State = x.State;
5629 }
5630
5631 return update;
5632 }
5633
5572 private bool HandleAgentUpdate(IClientAPI sener, Packet packet) 5634 private bool HandleAgentUpdate(IClientAPI sener, Packet packet)
5573 { 5635 {
5574 if (OnAgentUpdate != null) 5636 if (OnAgentUpdate != null)
5575 { 5637 {
5576 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet; 5638 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
5577 5639
5578 #region Packet Session and User Check 5640 // Now done earlier
5579 if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId) 5641// #region Packet Session and User Check
5580 { 5642// if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId)
5581 PacketPool.Instance.ReturnPacket(packet); 5643// {
5582 return false; 5644// PacketPool.Instance.ReturnPacket(packet);
5583 } 5645// return false;
5584 #endregion 5646// }
5585 5647// #endregion
5586 bool update = false; 5648//
5649// bool update = false;
5587 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData; 5650 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData;
5588 5651//
5589 if (m_lastAgentUpdateArgs != null) 5652// if (m_lastAgentUpdateArgs != null)
5590 { 5653// {
5591 // These should be ordered from most-likely to 5654// // These should be ordered from most-likely to
5592 // least likely to change. I've made an initial 5655// // least likely to change. I've made an initial
5593 // guess at that. 5656// // guess at that.
5594 update = 5657// update =
5595 ( 5658// (
5596 (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) || 5659// (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) ||
5597 (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) || 5660// (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) ||
5598 (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) || 5661// (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) ||
5599 (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || 5662// (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) ||
5600 (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || 5663// (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) ||
5601 (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) || 5664// (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) ||
5602 (x.Far != m_lastAgentUpdateArgs.Far) || 5665// (x.Far != m_lastAgentUpdateArgs.Far) ||
5603 (x.Flags != m_lastAgentUpdateArgs.Flags) || 5666// (x.Flags != m_lastAgentUpdateArgs.Flags) ||
5604 (x.State != m_lastAgentUpdateArgs.State) || 5667// (x.State != m_lastAgentUpdateArgs.State) ||
5605 (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) || 5668// (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) ||
5606 (x.SessionID != m_lastAgentUpdateArgs.SessionID) || 5669// (x.SessionID != m_lastAgentUpdateArgs.SessionID) ||
5607 (x.AgentID != m_lastAgentUpdateArgs.AgentID) 5670// (x.AgentID != m_lastAgentUpdateArgs.AgentID)
5608 ); 5671// );
5609 } 5672// }
5610 else 5673//
5611 { 5674// if (update)
5612 m_lastAgentUpdateArgs = new AgentUpdateArgs(); 5675// {
5613 update = true; 5676//// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name);
5614 }
5615
5616 if (update)
5617 {
5618// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name);
5619 TotalSignificantAgentUpdates++; 5677 TotalSignificantAgentUpdates++;
5620 5678
5621 m_lastAgentUpdateArgs.AgentID = x.AgentID; 5679 m_thisAgentUpdateArgs.AgentID = x.AgentID;
5622 m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation; 5680 m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
5623 m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis; 5681 m_thisAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
5624 m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter; 5682 m_thisAgentUpdateArgs.CameraCenter = x.CameraCenter;
5625 m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis; 5683 m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
5626 m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis; 5684 m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
5627 m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags; 5685 m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
5628 m_lastAgentUpdateArgs.Far = x.Far; 5686 m_thisAgentUpdateArgs.Far = x.Far;
5629 m_lastAgentUpdateArgs.Flags = x.Flags; 5687 m_thisAgentUpdateArgs.Flags = x.Flags;
5630 m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation; 5688 m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
5631 m_lastAgentUpdateArgs.SessionID = x.SessionID; 5689 m_thisAgentUpdateArgs.SessionID = x.SessionID;
5632 m_lastAgentUpdateArgs.State = x.State; 5690 m_thisAgentUpdateArgs.State = x.State;
5633 5691
5634 UpdateAgent handlerAgentUpdate = OnAgentUpdate; 5692 UpdateAgent handlerAgentUpdate = OnAgentUpdate;
5635 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate; 5693 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
5636 5694
5637 if (handlerPreAgentUpdate != null) 5695 if (handlerPreAgentUpdate != null)
5638 OnPreAgentUpdate(this, m_lastAgentUpdateArgs); 5696 OnPreAgentUpdate(this, m_thisAgentUpdateArgs);
5639 5697
5640 if (handlerAgentUpdate != null) 5698 if (handlerAgentUpdate != null)
5641 OnAgentUpdate(this, m_lastAgentUpdateArgs); 5699 OnAgentUpdate(this, m_thisAgentUpdateArgs);
5642 5700
5643 handlerAgentUpdate = null; 5701 handlerAgentUpdate = null;
5644 handlerPreAgentUpdate = null; 5702 handlerPreAgentUpdate = null;
5645 } 5703// }
5646 } 5704 }
5647 5705
5648 PacketPool.Instance.ReturnPacket(packet); 5706 PacketPool.Instance.ReturnPacket(packet);
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 78d4165..766c2fe 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1307,8 +1307,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1307 LogPacketHeader(true, udpClient.CircuitCode, 0, packet.Type, (ushort)packet.Length); 1307 LogPacketHeader(true, udpClient.CircuitCode, 0, packet.Type, (ushort)packet.Length);
1308 #endregion BinaryStats 1308 #endregion BinaryStats
1309 1309
1310 if (m_discardAgentUpdates && packet.Type == PacketType.AgentUpdate) 1310 if (packet.Type == PacketType.AgentUpdate)
1311 return; 1311 {
1312 if (m_discardAgentUpdates)
1313 return;
1314
1315 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
1316
1317 if (agentUpdate.AgentData.SessionID != client.SessionId
1318 || agentUpdate.AgentData.AgentID != client.AgentId
1319 || !((LLClientView)client).CheckAgentUpdateSignificance(agentUpdate.AgentData))
1320 {
1321 PacketPool.Instance.ReturnPacket(packet);
1322 return;
1323 }
1324 }
1312 1325
1313 #region Ping Check Handling 1326 #region Ping Check Handling
1314 1327
diff --git a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
index c208b38..3e6067d 100644
--- a/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
+++ b/OpenSim/Region/OptionalModules/Agent/UDP/Linden/LindenUDPInfoModule.cs
@@ -611,7 +611,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
611 // 611 //
612 if (showParams.Length <= 4) 612 if (showParams.Length <= 4)
613 { 613 {
614 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", "Region", "Name", "Root", "Time", "Reqs/min", "Sig. AgentUpdates"); 614 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}", "Region", "Name", "Root", "Time", "Reqs/min", "Sig. AgentUpdates");
615 foreach (Scene scene in m_scenes.Values) 615 foreach (Scene scene in m_scenes.Values)
616 { 616 {
617 scene.ForEachClient( 617 scene.ForEachClient(
@@ -624,7 +624,7 @@ namespace OpenSim.Region.OptionalModules.UDP.Linden
624 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum(); 624 int avg_reqs = cinfo.AsyncRequests.Values.Sum() + cinfo.GenericRequests.Values.Sum() + cinfo.SyncRequests.Values.Sum();
625 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1); 625 avg_reqs = avg_reqs / ((DateTime.Now - cinfo.StartedTime).Minutes + 1);
626 626
627 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11}/min {5,-16}", 627 m_log.InfoFormat("[INFO]: {0,-12} {1,-20} {2,-6} {3,-11} {4,-11} {5,-16}",
628 scene.RegionInfo.RegionName, llClient.Name, 628 scene.RegionInfo.RegionName, llClient.Name,
629 llClient.SceneAgent.IsChildAgent ? "N" : "Y", 629 llClient.SceneAgent.IsChildAgent ? "N" : "Y",
630 (DateTime.Now - cinfo.StartedTime).Minutes, 630 (DateTime.Now - cinfo.StartedTime).Minutes,