aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs103
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs31
2 files changed, 96 insertions, 38 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 14cc863..f8391d7 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -70,6 +70,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
70 public void AddScene(IScene scene) 70 public void AddScene(IScene scene)
71 { 71 {
72 m_udpServer.AddScene(scene); 72 m_udpServer.AddScene(scene);
73
74 StatsManager.RegisterStat(
75 new Stat(
76 "IncomingPacketsProcessedCount",
77 "Number of inbound UDP packets processed",
78 "Number of inbound UDP packets processed",
79 "",
80 "clientstack",
81 scene.Name,
82 StatType.Pull,
83 stat => stat.Value = m_udpServer.IncomingPacketsProcessed,
84 StatVerbosity.Debug));
73 } 85 }
74 86
75 public bool HandlesRegion(Location x) 87 public bool HandlesRegion(Location x)
@@ -170,6 +182,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
170 182
171 private Pool<IncomingPacket> m_incomingPacketPool; 183 private Pool<IncomingPacket> m_incomingPacketPool;
172 184
185 /// <summary>
186 /// Stat for number of packets in the main pool awaiting use.
187 /// </summary>
188 private Stat m_poolCountStat;
189
190 /// <summary>
191 /// Stat for number of packets in the inbound packet pool awaiting use.
192 /// </summary>
173 private Stat m_incomingPacketPoolStat; 193 private Stat m_incomingPacketPoolStat;
174 194
175 private int m_defaultRTO = 0; 195 private int m_defaultRTO = 0;
@@ -342,20 +362,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
342 362
343 m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500); 363 m_incomingPacketPool = new Pool<IncomingPacket>(() => new IncomingPacket(), 500);
344 364
345 m_incomingPacketPoolStat
346 = new Stat(
347 "IncomingPacketPoolCount",
348 "Objects within incoming packet pool",
349 "The number of objects currently stored within the incoming packet pool",
350 "",
351 "clientstack",
352 "packetpool",
353 StatType.Pull,
354 stat => stat.Value = m_incomingPacketPool.Count,
355 StatVerbosity.Debug);
356
357 StatsManager.RegisterStat(m_incomingPacketPoolStat);
358
359 return true; 365 return true;
360 } 366 }
361 367
@@ -379,6 +385,53 @@ namespace OpenSim.Region.ClientStack.LindenUDP
379 } 385 }
380 386
381 /// <summary> 387 /// <summary>
388 /// This is a seperate method so that it can be called once we have an m_scene to distinguish different scene
389 /// stats.
390 /// </summary>
391 private void EnablePoolStats()
392 {
393 m_poolCountStat
394 = new Stat(
395 "UDPPacketBufferPoolCount",
396 "Objects within the UDPPacketBuffer pool",
397 "The number of objects currently stored within the UDPPacketBuffer pool",
398 "",
399 "clientstack",
400 m_scene.Name,
401 StatType.Pull,
402 stat => stat.Value = Pool.Count,
403 StatVerbosity.Debug);
404
405 StatsManager.RegisterStat(m_poolCountStat);
406
407 m_incomingPacketPoolStat
408 = new Stat(
409 "IncomingPacketPoolCount",
410 "Objects within incoming packet pool",
411 "The number of objects currently stored within the incoming packet pool",
412 "",
413 "clientstack",
414 m_scene.Name,
415 StatType.Pull,
416 stat => stat.Value = m_incomingPacketPool.Count,
417 StatVerbosity.Debug);
418
419 StatsManager.RegisterStat(m_incomingPacketPoolStat);
420 }
421
422 /// <summary>
423 /// Disables pool stats.
424 /// </summary>
425 private void DisablePoolStats()
426 {
427 StatsManager.DeregisterStat(m_poolCountStat);
428 m_poolCountStat = null;
429
430 StatsManager.DeregisterStat(m_incomingPacketPoolStat);
431 m_incomingPacketPoolStat = null;
432 }
433
434 /// <summary>
382 /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging. 435 /// If the outgoing UDP thread times out, then return client that was being processed to help with debugging.
383 /// </summary> 436 /// </summary>
384 /// <returns></returns> 437 /// <returns></returns>
@@ -416,6 +469,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
416 469
417 m_scene = (Scene)scene; 470 m_scene = (Scene)scene;
418 m_location = new Location(m_scene.RegionInfo.RegionHandle); 471 m_location = new Location(m_scene.RegionInfo.RegionHandle);
472
473 // We delay enabling pool stats to AddScene() instead of Initialize() so that we can distinguish pool stats by
474 // scene name
475 if (UsePools)
476 EnablePoolStats();
419 477
420 MainConsole.Instance.Commands.AddCommand( 478 MainConsole.Instance.Commands.AddCommand(
421 "Debug", 479 "Debug",
@@ -505,12 +563,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
505 if (enabled == "on") 563 if (enabled == "on")
506 { 564 {
507 if (EnablePools()) 565 if (EnablePools())
566 {
567 EnablePoolStats();
508 MainConsole.Instance.OutputFormat("Packet pools enabled on {0}", m_scene.Name); 568 MainConsole.Instance.OutputFormat("Packet pools enabled on {0}", m_scene.Name);
569 }
509 } 570 }
510 else if (enabled == "off") 571 else if (enabled == "off")
511 { 572 {
512 if (DisablePools()) 573 if (DisablePools())
574 {
575 DisablePoolStats();
513 MainConsole.Instance.OutputFormat("Packet pools disabled on {0}", m_scene.Name); 576 MainConsole.Instance.OutputFormat("Packet pools disabled on {0}", m_scene.Name);
577 }
514 } 578 }
515 else 579 else
516 { 580 {
@@ -1556,6 +1620,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1556 private int npacksSent = 0; 1620 private int npacksSent = 0;
1557 private int npackNotSent = 0; 1621 private int npackNotSent = 0;
1558 1622
1623 /// <summary>
1624 /// Number of inbound packets processed since startup.
1625 /// </summary>
1626 public long IncomingPacketsProcessed { get; private set; }
1627
1559 private void MonitoredClientOutgoingPacketHandler(IClientAPI client) 1628 private void MonitoredClientOutgoingPacketHandler(IClientAPI client)
1560 { 1629 {
1561 nticks++; 1630 nticks++;
@@ -1615,7 +1684,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1615 npacksSent++; 1684 npacksSent++;
1616 } 1685 }
1617 else 1686 else
1687 {
1618 npackNotSent++; 1688 npackNotSent++;
1689 }
1619 1690
1620 watch2.Stop(); 1691 watch2.Stop();
1621 avgDequeueTicks = (nticks - 1) / (float)nticks * avgDequeueTicks + (watch2.ElapsedTicks / (float)nticks); 1692 avgDequeueTicks = (nticks - 1) / (float)nticks * avgDequeueTicks + (watch2.ElapsedTicks / (float)nticks);
@@ -1623,7 +1694,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1623 1694
1624 } 1695 }
1625 else 1696 else
1697 {
1626 m_log.WarnFormat("[LLUDPSERVER]: Client is not connected"); 1698 m_log.WarnFormat("[LLUDPSERVER]: Client is not connected");
1699 }
1627 } 1700 }
1628 } 1701 }
1629 catch (Exception ex) 1702 catch (Exception ex)
@@ -1687,6 +1760,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1687 "[LLUDPSERVER]: Dropped incoming {0} for dead client {1} in {2}", 1760 "[LLUDPSERVER]: Dropped incoming {0} for dead client {1} in {2}",
1688 packet.Type, client.Name, m_scene.RegionInfo.RegionName); 1761 packet.Type, client.Name, m_scene.RegionInfo.RegionName);
1689 } 1762 }
1763
1764 IncomingPacketsProcessed++;
1690 } 1765 }
1691 1766
1692 protected void LogoutHandler(IClientAPI client) 1767 protected void LogoutHandler(IClientAPI client)
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
index 85cbb06..808d177 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/OpenSimUDPBase.cs
@@ -61,14 +61,14 @@ namespace OpenMetaverse
61 private bool m_asyncPacketHandling; 61 private bool m_asyncPacketHandling;
62 62
63 /// <summary> 63 /// <summary>
64 /// Pool to use for handling data. May be null if UsePools = false; 64 /// Are we to use object pool(s) to reduce memory churn when receiving data?
65 /// </summary> 65 /// </summary>
66 protected OpenSim.Framework.Pool<UDPPacketBuffer> m_pool; 66 public bool UsePools { get; protected set; }
67 67
68 /// <summary> 68 /// <summary>
69 /// Are we to use object pool(s) to reduce memory churn when receiving data? 69 /// Pool to use for handling data. May be null if UsePools = false;
70 /// </summary> 70 /// </summary>
71 public bool UsePools { get; protected set; } 71 protected OpenSim.Framework.Pool<UDPPacketBuffer> Pool { get; private set; }
72 72
73 /// <summary>Returns true if the server is currently listening for inbound packets, otherwise false</summary> 73 /// <summary>Returns true if the server is currently listening for inbound packets, otherwise false</summary>
74 public bool IsRunningInbound { get; private set; } 74 public bool IsRunningInbound { get; private set; }
@@ -77,8 +77,6 @@ namespace OpenMetaverse
77 /// <remarks>If IsRunningOut = false, then any request to send a packet is simply dropped.</remarks> 77 /// <remarks>If IsRunningOut = false, then any request to send a packet is simply dropped.</remarks>
78 public bool IsRunningOutbound { get; private set; } 78 public bool IsRunningOutbound { get; private set; }
79 79
80 private Stat m_poolCountStat;
81
82 /// <summary> 80 /// <summary>
83 /// Default constructor 81 /// Default constructor
84 /// </summary> 82 /// </summary>
@@ -182,21 +180,7 @@ namespace OpenMetaverse
182 { 180 {
183 if (!UsePools) 181 if (!UsePools)
184 { 182 {
185 m_pool = new Pool<UDPPacketBuffer>(() => new UDPPacketBuffer(), 500); 183 Pool = new Pool<UDPPacketBuffer>(() => new UDPPacketBuffer(), 500);
186
187 m_poolCountStat
188 = new Stat(
189 "UDPPacketBufferPoolCount",
190 "Objects within the UDPPacketBuffer pool",
191 "The number of objects currently stored within the UDPPacketBuffer pool",
192 "",
193 "clientstack",
194 "packetpool",
195 StatType.Pull,
196 stat => stat.Value = m_pool.Count,
197 StatVerbosity.Debug);
198
199 StatsManager.RegisterStat(m_poolCountStat);
200 184
201 UsePools = true; 185 UsePools = true;
202 186
@@ -211,7 +195,6 @@ namespace OpenMetaverse
211 if (UsePools) 195 if (UsePools)
212 { 196 {
213 UsePools = false; 197 UsePools = false;
214 StatsManager.DeregisterStat(m_poolCountStat);
215 198
216 // We won't null out the pool to avoid a race condition with code that may be in the middle of using it. 199 // We won't null out the pool to avoid a race condition with code that may be in the middle of using it.
217 200
@@ -226,7 +209,7 @@ namespace OpenMetaverse
226 UDPPacketBuffer buf; 209 UDPPacketBuffer buf;
227 210
228 if (UsePools) 211 if (UsePools)
229 buf = m_pool.GetObject(); 212 buf = Pool.GetObject();
230 else 213 else
231 buf = new UDPPacketBuffer(); 214 buf = new UDPPacketBuffer();
232 215
@@ -309,7 +292,7 @@ namespace OpenMetaverse
309 finally 292 finally
310 { 293 {
311 if (UsePools) 294 if (UsePools)
312 m_pool.ReturnObject(buffer); 295 Pool.ReturnObject(buffer);
313 296
314 // Synchronous mode waits until the packet callback completes 297 // Synchronous mode waits until the packet callback completes
315 // before starting the receive to fetch another packet 298 // before starting the receive to fetch another packet