aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorMelanie2012-08-30 00:34:12 +0200
committerMelanie2012-08-30 00:34:12 +0200
commit211f4fb4114b2b26abe9c056bca9f6159ccbd125 (patch)
tree5d02634387b937f0f077b5a3dfbd9efa00d043db /OpenSim
parentAllow llList2Key to also act on System.String (diff)
downloadopensim-SC_OLD-211f4fb4114b2b26abe9c056bca9f6159ccbd125.zip
opensim-SC_OLD-211f4fb4114b2b26abe9c056bca9f6159ccbd125.tar.gz
opensim-SC_OLD-211f4fb4114b2b26abe9c056bca9f6159ccbd125.tar.bz2
opensim-SC_OLD-211f4fb4114b2b26abe9c056bca9f6159ccbd125.tar.xz
Sequence inventory descendents requests to reduce inventory server load and
movement lag.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs60
2 files changed, 56 insertions, 5 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 75a47d5..d6513c5 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -927,6 +927,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
927 packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet)); 927 packetInbox.EnqueueHigh(new IncomingPacket((LLClientView)client, packet));
928 else 928 else
929 packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet)); 929 packetInbox.EnqueueLow(new IncomingPacket((LLClientView)client, packet));
930// packetInbox.Enqueue(new IncomingPacket((LLClientView)client, packet));
930 } 931 }
931 932
932 #region BinaryStats 933 #region BinaryStats
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 431b903..e970543 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -422,6 +422,20 @@ namespace OpenSim.Region.Framework.Scenes
422 ); 422 );
423 } 423 }
424 424
425 private class DescendentsRequestData
426 {
427 public IClientAPI RemoteClient;
428 public UUID FolderID;
429 public UUID OwnerID;
430 public bool FetchFolders;
431 public bool FetchItems;
432 public int SortOrder;
433 }
434
435 private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>();
436 private Object m_descendentsRequestLock = new Object();
437 private bool m_descendentsRequestProcessing = false;
438
425 /// <summary> 439 /// <summary>
426 /// Tell the client about the various child items and folders contained in the requested folder. 440 /// Tell the client about the various child items and folders contained in the requested folder.
427 /// </summary> 441 /// </summary>
@@ -458,17 +472,38 @@ namespace OpenSim.Region.Framework.Scenes
458 } 472 }
459 } 473 }
460 474
461 // We're going to send the reply async, because there may be 475 lock (m_descendentsRequestLock)
462 // an enormous quantity of packets -- basically the entire inventory! 476 {
463 // We don't want to block the client thread while all that is happening. 477 if (!m_descendentsRequestProcessing)
464 SendInventoryDelegate d = SendInventoryAsync; 478 {
465 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); 479 m_descendentsRequestProcessing = true;
480
481 // We're going to send the reply async, because there may be
482 // an enormous quantity of packets -- basically the entire inventory!
483 // We don't want to block the client thread while all that is happening.
484 SendInventoryDelegate d = SendInventoryAsync;
485 d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d);
486
487 return;
488 }
489
490 DescendentsRequestData req = new DescendentsRequestData();
491 req.RemoteClient = remoteClient;
492 req.FolderID = folderID;
493 req.OwnerID = ownerID;
494 req.FetchFolders = fetchFolders;
495 req.FetchItems = fetchItems;
496 req.SortOrder = sortOrder;
497
498 m_descendentsRequestQueue.Enqueue(req);
499 }
466 } 500 }
467 501
468 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); 502 delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder);
469 503
470 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) 504 void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder)
471 { 505 {
506 Thread.Sleep(20);
472 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); 507 SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems);
473 } 508 }
474 509
@@ -476,6 +511,21 @@ namespace OpenSim.Region.Framework.Scenes
476 { 511 {
477 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; 512 SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState;
478 d.EndInvoke(iar); 513 d.EndInvoke(iar);
514
515 lock (m_descendentsRequestLock)
516 {
517 if (m_descendentsRequestQueue.Count > 0)
518 {
519 DescendentsRequestData req = m_descendentsRequestQueue.Dequeue();
520
521 d = SendInventoryAsync;
522 d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d);
523
524 return;
525 }
526
527 m_descendentsRequestProcessing = false;
528 }
479 } 529 }
480 530
481 /// <summary> 531 /// <summary>