From fa9a4a9a2b145fed271001f3836df9cef8103e5e Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 9 Jul 2016 00:20:51 +0100 Subject: [PATCH 1/7] some changes to RequestInventoryFile() --- .../Scenes/SceneObjectPartInventory.cs | 78 +++++++++---------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 3b029f2221..5b64aac01b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -48,6 +48,8 @@ namespace OpenSim.Region.Framework.Scenes private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private byte[] m_inventoryFileData = new byte[0]; + private byte[] m_inventoryFileNameBytes = new byte[0]; + private string m_inventoryFileName = ""; private uint m_inventoryFileNameSerial = 0; private bool m_inventoryPrivileged = false; private object m_inventoryFileLock = new object(); @@ -1112,18 +1114,34 @@ namespace OpenSim.Region.Framework.Scenes /// public void RequestInventoryFile(IClientAPI client, IXfer xferManager) { - lock (m_inventoryFileLock) { - string filename = "inventory_" + UUID.Random().ToString() + ".tmp"; - bool changed = false; - if (m_inventoryFileNameSerial < m_inventorySerial) + + Items.LockItemsForRead(true); + + if (m_inventorySerial == 0) // No inventory + { + Items.LockItemsForRead(false); + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); + return; + } + + if (m_items.Count == 0) // No inventory + { + Items.LockItemsForRead(false); + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); + return; + } + + if (m_inventoryFileNameSerial != m_inventorySerial) { m_inventoryFileNameSerial = m_inventorySerial; changed = true; } + Items.LockItemsForRead(false); + if (m_inventoryFileData.Length < 2) changed = true; @@ -1134,32 +1152,11 @@ namespace OpenSim.Region.Framework.Scenes if (m_inventoryPrivileged != includeAssets) changed = true; - - Items.LockItemsForRead(true); - - if (m_inventorySerial == 0) // No inventory - { - Items.LockItemsForRead(false); - client.SendTaskInventory(m_part.UUID, 0, new byte[0]); - - return; - } - - if (m_items.Count == 0) // No inventory - { - Items.LockItemsForRead(false); - client.SendTaskInventory(m_part.UUID, 0, new byte[0]); - return; - } - if (!changed) { - Items.LockItemsForRead(false); - - xferManager.AddNewFile(filename, - m_inventoryFileData); + xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); client.SendTaskInventory(m_part.UUID, (short)m_inventoryFileNameSerial, - Util.StringToBytes256(filename)); + m_inventoryFileNameBytes); return; } @@ -1168,6 +1165,8 @@ namespace OpenSim.Region.Framework.Scenes InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); + Items.LockItemsForRead(true); + foreach (TaskInventoryItem item in m_items.Values) { UUID ownerID = item.OwnerID; @@ -1222,9 +1221,10 @@ namespace OpenSim.Region.Framework.Scenes if (m_inventoryFileData.Length > 2) { - xferManager.AddNewFile(filename, m_inventoryFileData); - client.SendTaskInventory(m_part.UUID, (short)m_inventoryFileNameSerial, - Util.StringToBytes256(filename)); + m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; + m_inventoryFileNameBytes = Util.StringToBytes256(m_inventoryFileName); + xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); + client.SendTaskInventory(m_part.UUID, (short)m_inventoryFileNameSerial,m_inventoryFileNameBytes); return; } @@ -1267,26 +1267,22 @@ namespace OpenSim.Region.Framework.Scenes AddNameValueLine("obj_id", folderID.ToString()); AddNameValueLine("parent_id", parentID.ToString()); AddNameValueLine("type", "category"); - AddNameValueLine("name", "Contents|"); - AddSectionEnd(); + AddNameValueLine("name", "Contents|\n\t}"); } public void AddItemStart() { - BuildString.Append("\tinv_item\t0\n"); - AddSectionStart(); + BuildString.Append("\tinv_item\t0\n\t{\n"); } public void AddPermissionsStart() { - BuildString.Append("\tpermissions 0\n"); - AddSectionStart(); + BuildString.Append("\tpermissions 0\n\t{\n"); } public void AddSaleStart() { - BuildString.Append("\tsale_info\t0\n"); - AddSectionStart(); + BuildString.Append("\tsale_info\t0\n\t{\n"); } protected void AddSectionStart() @@ -1307,8 +1303,10 @@ namespace OpenSim.Region.Framework.Scenes public void AddNameValueLine(string name, string value) { BuildString.Append("\t\t"); - BuildString.Append(name + "\t"); - BuildString.Append(value + "\n"); + BuildString.Append(name); + BuildString.Append("\t"); + BuildString.Append(value); + BuildString.Append("\n"); } public String GetString() From 415c45b0971dbd7b16587ce9f02cb68cf740a13d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 9 Jul 2016 01:32:27 +0100 Subject: [PATCH 2/7] add a simple files expire to Xfer to catch some that never got a request (opened xfers also need a timeout) (not pretty code, but should not have heavy use) --- .../CoreModules/Agent/Xfer/XferModule.cs | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 7113f4f8f2..391326fb3f 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs @@ -45,7 +45,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer private Scene m_scene; private Dictionary NewFiles = new Dictionary(); private Dictionary Transfers = new Dictionary(); - + private double lastFilesExpire = 0; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public struct XferRequest @@ -59,13 +59,15 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer private class FileData { public byte[] Data; - public int Count; + public int refsCount; + public double timeStampMS; } #region INonSharedRegionModule Members public void Initialise(IConfigSource config) { + lastFilesExpire = Util.GetTimeStampMS() + 300000.0; } public void AddRegion(Scene scene) @@ -118,20 +120,36 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer { lock (NewFiles) { + double now = Util.GetTimeStampMS(); if (NewFiles.ContainsKey(fileName)) { - NewFiles[fileName].Count++; + NewFiles[fileName].refsCount++; NewFiles[fileName].Data = data; + NewFiles[fileName].timeStampMS = now; } else { FileData fd = new FileData(); - fd.Count = 1; + fd.refsCount = 1; fd.Data = data; + fd.timeStampMS = now; NewFiles.Add(fileName, fd); } - } + // lazy expires hopefully we will not have many files so nasty code will do it + if(now - lastFilesExpire > 180000.0) + { + lastFilesExpire = now; + List expires = new List(); + foreach(string fname in NewFiles.Keys) + { + if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 180000.0) + expires.Add(fname); + } + foreach(string fname in expires) + NewFiles.Remove(fname); + } + } return true; } @@ -226,10 +244,10 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer if (NewFiles.ContainsKey(fileName)) { - if (NewFiles[fileName].Count == 1) + if (NewFiles[fileName].refsCount == 1) NewFiles.Remove(fileName); else - NewFiles[fileName].Count--; + NewFiles[fileName].refsCount--; } } From 21de9162258057a59cf42acad89938b353c02d6f Mon Sep 17 00:00:00 2001 From: Kevin Cozens Date: Fri, 8 Jul 2016 16:04:36 -0400 Subject: [PATCH 3/7] Fixed the order of two file names used in a warning. --- OpenSim/Framework/Util.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 65b2a5cdf9..1b3a4c3599 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1303,7 +1303,7 @@ namespace OpenSim.Framework } catch (Exception e) { - m_log.WarnFormat("[UTILS]: Exception copying configuration file {0} to {1}: {2}", configFile, exampleConfigFile, e.Message); + m_log.WarnFormat("[UTILS]: Exception copying configuration file {0} to {1}: {2}", exampleConfigFile, configFile, e.Message); return false; } } From 941971648e27e33f617630d2a750c83548bddd13 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 9 Jul 2016 13:45:29 +0100 Subject: [PATCH 4/7] kick Xfermanager from heartbeat and expires files based on its timming --- .../CoreModules/Agent/Xfer/XferModule.cs | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 391326fb3f..468dccf67b 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs @@ -28,10 +28,12 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; using Nini.Config; using log4net; using OpenMetaverse; using OpenSim.Framework; +using OpenSim.Framework.Monitoring; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; @@ -45,9 +47,14 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer private Scene m_scene; private Dictionary NewFiles = new Dictionary(); private Dictionary Transfers = new Dictionary(); - private double lastFilesExpire = 0; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private object timeTickLock = new object(); + private double lastTimeTick = 0.0; + private bool inTimeTick = false; + private double lastFilesExpire = 0.0; + public struct XferRequest { public IClientAPI remoteClient; @@ -67,20 +74,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer public void Initialise(IConfigSource config) { - lastFilesExpire = Util.GetTimeStampMS() + 300000.0; + lastTimeTick = Util.GetTimeStampMS() + 30000.0; + lastFilesExpire = lastTimeTick + 180000.0; } public void AddRegion(Scene scene) { m_scene = scene; m_scene.EventManager.OnNewClient += NewClient; - + m_scene.EventManager.OnRegionHeartbeatEnd += OnTimeTick; m_scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) { m_scene.EventManager.OnNewClient -= NewClient; + m_scene.EventManager.OnRegionHeartbeatEnd -= OnTimeTick; m_scene.UnregisterModuleInterface(this); m_scene = null; @@ -106,6 +115,35 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer #endregion + public void OnTimeTick(Scene scene) + { + // we are on a heartbeat thread we there can be several + if(Monitor.TryEnter(timeTickLock)) + { + if(!inTimeTick) + { + double now = Util.GetTimeStampMS(); + if(now - lastTimeTick > 1500.0) // 1.5 second + { + inTimeTick = true; + + //don't overload busy heartbeat + WorkManager.RunInThread( + delegate + { + transfersTimeTick(now); + expireFiles(now); + + lastTimeTick = now; + inTimeTick = false; + }, + null, + "XferTimeTick"); + } + } + Monitor.Exit(timeTickLock); + } + } #region IXfer Members /// @@ -135,26 +173,31 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer fd.timeStampMS = now; NewFiles.Add(fileName, fd); } + } + return true; + } - // lazy expires hopefully we will not have many files so nasty code will do it - if(now - lastFilesExpire > 180000.0) + #endregion + public void expireFiles(double now) + { + lock (NewFiles) + { + // hopefully we will not have many files so nasty code will do it + if(now - lastFilesExpire > 120000.0) { lastFilesExpire = now; List expires = new List(); foreach(string fname in NewFiles.Keys) { - if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 180000.0) + if(NewFiles[fname].refsCount == 0 && now - NewFiles[fname].timeStampMS > 120000.0) expires.Add(fname); } foreach(string fname in expires) NewFiles.Remove(fname); } } - return true; } - #endregion - public void NewClient(IClientAPI client) { client.OnRequestXfer += RequestXfer; @@ -162,6 +205,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer client.OnAbortXfer += AbortXfer; } + public void transfersTimeTick(double now) + { + + } + /// /// /// From e6d57a1e49ce6f284dc03f7b8a57d08ade7b7ce4 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 10 Jul 2016 15:25:05 +0100 Subject: [PATCH 5/7] change Xfermanager file sending --- .../CoreModules/Agent/Xfer/XferModule.cs | 294 ++++++++++++------ 1 file changed, 194 insertions(+), 100 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 468dccf67b..437cbcd085 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs @@ -49,12 +49,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer private Dictionary Transfers = new Dictionary(); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private object timeTickLock = new object(); - private double lastTimeTick = 0.0; - private bool inTimeTick = false; - private double lastFilesExpire = 0.0; - + private object timeTickLock = new object(); + private double lastTimeTick = 0.0; + private double lastFilesExpire = 0.0; + private bool inTimeTick = false; + public struct XferRequest { public IClientAPI remoteClient; @@ -81,15 +80,15 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer public void AddRegion(Scene scene) { m_scene = scene; + m_scene.RegisterModuleInterface(this); m_scene.EventManager.OnNewClient += NewClient; m_scene.EventManager.OnRegionHeartbeatEnd += OnTimeTick; - m_scene.RegisterModuleInterface(this); } public void RemoveRegion(Scene scene) { m_scene.EventManager.OnNewClient -= NewClient; - m_scene.EventManager.OnRegionHeartbeatEnd -= OnTimeTick; + m_scene.EventManager.OnRegionHeartbeatEnd -= OnTimeTick; m_scene.UnregisterModuleInterface(this); m_scene = null; @@ -123,7 +122,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer if(!inTimeTick) { double now = Util.GetTimeStampMS(); - if(now - lastTimeTick > 1500.0) // 1.5 second + if(now - lastTimeTick > 1750.0) { inTimeTick = true; @@ -197,7 +196,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer } } } - + public void NewClient(IClientAPI client) { client.OnRequestXfer += RequestXfer; @@ -205,9 +204,49 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer client.OnAbortXfer += AbortXfer; } + public void OnClientClosed(IClientAPI client) + { + client.OnRequestXfer -= RequestXfer; + client.OnConfirmXfer -= AckPacket; + client.OnAbortXfer -= AbortXfer; + } + + private void RemoveOrDecrementFile(string fileName) + { + // NewFiles must be locked + + if (NewFiles.ContainsKey(fileName)) + { + if (NewFiles[fileName].refsCount == 1) + NewFiles.Remove(fileName); + else + NewFiles[fileName].refsCount--; + } + } + public void transfersTimeTick(double now) { - + XferDownLoad[] xfrs; + lock(Transfers) + { + if(Transfers.Count == 0) + return; + + xfrs = new XferDownLoad[Transfers.Count]; + Transfers.Values.CopyTo(xfrs,0); + } + foreach(XferDownLoad xfr in xfrs) + { + if(xfr.checkTime(now)) + { + ulong xfrID = xfr.XferID; + lock(Transfers) + { + if(Transfers.ContainsKey(xfrID)) + Transfers.Remove(xfrID); + } + } + } } /// @@ -222,80 +261,49 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer { if (NewFiles.ContainsKey(fileName)) { - if (!Transfers.ContainsKey(xferID)) + lock(Transfers) { - byte[] fileData = NewFiles[fileName].Data; - XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); - if (fileName.StartsWith("inventory_")) - transaction.isTaskInventory = true; + if (!Transfers.ContainsKey(xferID)) + { + byte[] fileData = NewFiles[fileName].Data; + XferDownLoad transaction = + new XferDownLoad(fileName, fileData, xferID, remoteClient); - Transfers.Add(xferID, transaction); + Transfers.Add(xferID, transaction); - if (transaction.StartSend()) - RemoveXferData(xferID); - - // The transaction for this file is either complete or on its way - RemoveOrDecrement(fileName); + transaction.StartSend(); + // The transaction for this file is on its way + RemoveOrDecrementFile(fileName); + } } } else - m_log.WarnFormat("[Xfer]: {0} not found", fileName); - + m_log.WarnFormat("[Xfer]: {0} not found", fileName); } } public void AckPacket(IClientAPI remoteClient, ulong xferID, uint packet) { - lock (NewFiles) // This is actually to lock Transfers + lock (Transfers) { if (Transfers.ContainsKey(xferID)) { - XferDownLoad dl = Transfers[xferID]; if (Transfers[xferID].AckPacket(packet)) - { - RemoveXferData(xferID); - RemoveOrDecrement(dl.FileName); - } + Transfers.Remove(xferID); } } } - private void RemoveXferData(ulong xferID) - { - // NewFiles must be locked! - if (Transfers.ContainsKey(xferID)) - { - XferModule.XferDownLoad xferItem = Transfers[xferID]; - //string filename = xferItem.FileName; - Transfers.Remove(xferID); - xferItem.Data = new byte[0]; // Clear the data - xferItem.DataPointer = 0; - - } - } - public void AbortXfer(IClientAPI remoteClient, ulong xferID) { - lock (NewFiles) + lock (Transfers) { if (Transfers.ContainsKey(xferID)) - RemoveOrDecrement(Transfers[xferID].FileName); - - RemoveXferData(xferID); - } - } - - private void RemoveOrDecrement(string fileName) - { - // NewFiles must be locked - - if (NewFiles.ContainsKey(fileName)) - { - if (NewFiles[fileName].refsCount == 1) - NewFiles.Remove(fileName); - else - NewFiles[fileName].refsCount--; + { + Transfers[xferID].done(); + Transfers.Remove(xferID); + } } } @@ -304,14 +312,19 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer public class XferDownLoad { public IClientAPI Client; - private bool complete; public byte[] Data = new byte[0]; - public int DataPointer = 0; public string FileName = String.Empty; - public uint Packet = 0; - public uint Serial = 1; public ulong XferID = 0; - public bool isTaskInventory = false; + public bool isDeleted = false; + + private object myLock = new object(); + private double lastsendTimeMS; + private int LastPacket; + private int lastBytes; + private int lastSentPacket; + private int lastAckPacket; + private int burstSize; + private int retries = 0; public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) { @@ -325,32 +338,97 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer { } + public void done() + { + if(!isDeleted) + { + Data = new byte[0]; + isDeleted = true; + } + } + /// /// Start a transfer /// /// True if the transfer is complete, false if not - public bool StartSend() + public void StartSend() { - if (Data.Length < 1000) + lock(myLock) { - // for now (testing) we only support files under 1000 bytes - byte[] transferData = new byte[Data.Length + 4]; - Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); - Array.Copy(Data, 0, transferData, 4, Data.Length); - Client.SendXferPacket(XferID, 0 + 0x80000000, transferData, isTaskInventory); - complete = true; + if(Data.Length == 0) //?? + { + LastPacket = 0; + lastBytes = 0; + burstSize = 0; + } + else + { + // payload of 1024bytes + LastPacket = Data.Length >> 10; + lastBytes = Data.Length & 0x3ff; + if(lastBytes == 0) + { + lastBytes = 1024; + LastPacket--; + } + burstSize = Client.GetAgentThrottleSilent((int)ThrottleOutPacketType.Asset) >> 11; + } + + lastAckPacket = -1; + lastSentPacket = -1; + + double now = Util.GetTimeStampMS(); + + SendBurst(now); + return; + } + } + + private void SendBurst(double now) + { + int start = lastAckPacket + 1; + int end = start + burstSize; + if (end > LastPacket) + end = LastPacket; + while(start <= end) + SendPacket(start++ , now); + } + + private void SendPacket(int pkt, double now) + { + if(pkt > LastPacket) + return; + + int pktsize; + uint pktid; + if (pkt == LastPacket) + { + pktsize = lastBytes; + pktid = (uint)pkt | 0x80000000u; } else { - byte[] transferData = new byte[1000 + 4]; - Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); - Array.Copy(Data, 0, transferData, 4, 1000); - Client.SendXferPacket(XferID, 0, transferData, isTaskInventory); - Packet++; - DataPointer = 1000; + pktsize = 1024; + pktid = (uint)pkt; } - return complete; + byte[] transferData; + if(pkt == 0) + { + transferData = new byte[pktsize + 4]; + Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); + Array.Copy(Data, 0, transferData, 4, pktsize); + } + else + { + transferData = new byte[pktsize]; + Array.Copy(Data, pkt << 10, transferData, 0, pktsize); + } + + Client.SendXferPacket(XferID, pktid, transferData, false); + + lastSentPacket = pkt; + lastsendTimeMS = now; } /// @@ -360,30 +438,46 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer /// True if the transfer is complete, false otherwise public bool AckPacket(uint packet) { - if (!complete) + lock(myLock) { - if ((Data.Length - DataPointer) > 1000) - { - byte[] transferData = new byte[1000]; - Array.Copy(Data, DataPointer, transferData, 0, 1000); - Client.SendXferPacket(XferID, Packet, transferData, isTaskInventory); - Packet++; - DataPointer += 1000; - } - else - { - byte[] transferData = new byte[Data.Length - DataPointer]; - Array.Copy(Data, DataPointer, transferData, 0, Data.Length - DataPointer); - uint endPacket = Packet |= (uint) 0x80000000; - Client.SendXferPacket(XferID, endPacket, transferData, isTaskInventory); - Packet++; - DataPointer += (Data.Length - DataPointer); + if(isDeleted) + return true; - complete = true; + packet &= 0x7fffffff; + if(lastAckPacket < packet) + lastAckPacket = (int)packet; + + if(lastAckPacket == LastPacket) + { + done(); + return true; } + double now = Util.GetTimeStampMS(); + SendPacket(lastSentPacket + 1, now); + return false; } + } - return complete; + public bool checkTime(double now) + { + if(Monitor.TryEnter(myLock)) + { + if(!isDeleted) + { + double timeMS = now - lastsendTimeMS; + if(timeMS > 60000.0) + done(); + else if(timeMS > 3500.0 && retries++ < 3) + { + burstSize >>= 1; + SendBurst(now); + } + } + + Monitor.Exit(myLock); + return isDeleted; + } + return false; } } From a92266d58e36282ccbccccea7ba5148fa4095377 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 10 Jul 2016 19:05:19 +0100 Subject: [PATCH 6/7] fix ObjectPropertiesFamilyPacket LastOwnerID --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 383031c729..a84d9028c7 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4796,7 +4796,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP block.SaleType = sop.ObjectSaleType; block.SalePrice = sop.SalePrice; block.Category = sop.Category; - block.LastOwnerID = sop.CreatorID; // copied from old SOG call... is this right? + block.LastOwnerID = sop.LastOwnerID; block.Name = Util.StringToBytes256(sop.Name); block.Description = Util.StringToBytes256(sop.Description); From 79fb13c95c7a752c44f3d6304788f0fc61f3414a Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 11 Jul 2016 12:05:47 +0100 Subject: [PATCH 7/7] reduce xfer burst if we are busy --- OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 437cbcd085..41ce860ff4 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs @@ -266,8 +266,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer if (!Transfers.ContainsKey(xferID)) { byte[] fileData = NewFiles[fileName].Data; + int burstSize = remoteClient.GetAgentThrottleSilent((int)ThrottleOutPacketType.Asset) >> 11; + if(Transfers.Count > 1) + burstSize /= Transfers.Count; XferDownLoad transaction = - new XferDownLoad(fileName, fileData, xferID, remoteClient); + new XferDownLoad(fileName, fileData, xferID, remoteClient, burstSize); Transfers.Add(xferID, transaction); @@ -326,12 +329,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer private int burstSize; private int retries = 0; - public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client) + public XferDownLoad(string fileName, byte[] data, ulong xferID, IClientAPI client, int burstsz) { FileName = fileName; Data = data; XferID = xferID; Client = client; + burstSize = burstsz; } public XferDownLoad() @@ -371,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer lastBytes = 1024; LastPacket--; } - burstSize = Client.GetAgentThrottleSilent((int)ThrottleOutPacketType.Asset) >> 11; + } lastAckPacket = -1;