* Stop asset transactions hanging around after they've completed
* Still not enough to solve the memory leak, though hopefully this is another step on the path * All these changes are pretty temporary - this will be addressed with a more fundamental refactor in the futureThreadPoolClientBranch
parent
fadf5b479f
commit
16f8f19a54
|
@ -25,13 +25,19 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Communications.Cache
|
namespace OpenSim.Framework.Communications.Cache
|
||||||
{
|
{
|
||||||
public class AssetTransactionManager
|
public class AssetTransactionManager
|
||||||
{
|
{
|
||||||
|
private static readonly log4net.ILog m_log
|
||||||
|
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
public CommunicationsManager CommsManager;
|
public CommunicationsManager CommsManager;
|
||||||
|
|
||||||
|
@ -92,7 +98,17 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
AgentAssetTransactions.AssetXferUploader uploader = transactions.RequestXferUploader(transaction);
|
AgentAssetTransactions.AssetXferUploader uploader = transactions.RequestXferUploader(transaction);
|
||||||
if (uploader != null)
|
if (uploader != null)
|
||||||
{
|
{
|
||||||
uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile);
|
// Upload has already compelted uploading...
|
||||||
|
if (uploader.Initialise(remoteClient, assetID, transaction, type, data, storeLocal, tempFile))
|
||||||
|
{
|
||||||
|
lock (transactions.XferUploaders)
|
||||||
|
{
|
||||||
|
// XXX Weak ass way of doing this by directly manipulating this public dictionary, purely temporary
|
||||||
|
transactions.XferUploaders.Remove(uploader.TransactionID);
|
||||||
|
|
||||||
|
m_log.Info(String.Format("[ASSET TRANSACTIONS] Current uploaders: {0}", transactions.XferUploaders.Count));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
{
|
{
|
||||||
public class AgentAssetTransactions
|
public class AgentAssetTransactions
|
||||||
{
|
{
|
||||||
|
private static readonly log4net.ILog m_log
|
||||||
|
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
// Fields
|
// Fields
|
||||||
public List<AssetCapsUploader> CapsUploaders = new List<AssetCapsUploader>();
|
public List<AssetCapsUploader> CapsUploaders = new List<AssetCapsUploader>();
|
||||||
public List<NoteCardCapsUpdate> NotecardUpdaters = new List<NoteCardCapsUpdate>();
|
public List<NoteCardCapsUpdate> NotecardUpdaters = new List<NoteCardCapsUpdate>();
|
||||||
|
@ -73,22 +76,48 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
{
|
{
|
||||||
AssetXferUploader uploader = new AssetXferUploader(this, m_dumpAssetsToFile);
|
AssetXferUploader uploader = new AssetXferUploader(this, m_dumpAssetsToFile);
|
||||||
|
|
||||||
|
lock (XferUploaders)
|
||||||
|
{
|
||||||
XferUploaders.Add(transactionID, uploader);
|
XferUploaders.Add(transactionID, uploader);
|
||||||
|
}
|
||||||
|
|
||||||
return uploader;
|
return uploader;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HandleXfer(ulong xferID, uint packetID, byte[] data)
|
public void HandleXfer(ulong xferID, uint packetID, byte[] data)
|
||||||
|
{
|
||||||
|
AssetXferUploader uploaderFound = null;
|
||||||
|
|
||||||
|
lock (XferUploaders)
|
||||||
{
|
{
|
||||||
foreach (AssetXferUploader uploader in XferUploaders.Values)
|
foreach (AssetXferUploader uploader in XferUploaders.Values)
|
||||||
{
|
{
|
||||||
if (uploader.XferID == xferID)
|
if (uploader.XferID == xferID)
|
||||||
{
|
{
|
||||||
uploader.HandleXferPacket(xferID, packetID, data);
|
if (uploader.HandleXferPacket(xferID, packetID, data))
|
||||||
|
{
|
||||||
|
uploaderFound = uploader;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove the uploader once the uploader is complete
|
||||||
|
if (uploaderFound != null)
|
||||||
|
{
|
||||||
|
m_log.Info(
|
||||||
|
String.Format(
|
||||||
|
"[ASSET TRANSACTIONS] Removing asset xfer uploader with transfer id {0}, transaction {1}",
|
||||||
|
xferID, uploaderFound.TransactionID));
|
||||||
|
|
||||||
|
XferUploaders.Remove(uploaderFound.TransactionID);
|
||||||
|
|
||||||
|
m_log.Info(String.Format("[ASSET TRANSACTIONS] Current uploaders: {0}", XferUploaders.Count));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RequestCreateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
|
public void RequestCreateInventoryItem(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
|
||||||
|
@ -114,7 +143,11 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
{
|
{
|
||||||
AssetXferUploader uploader = XferUploaders[transactionID];
|
AssetXferUploader uploader = XferUploaders[transactionID];
|
||||||
AssetBase asset = uploader.GetAssetData();
|
AssetBase asset = uploader.GetAssetData();
|
||||||
|
|
||||||
|
lock (XferUploaders)
|
||||||
|
{
|
||||||
XferUploaders.Remove(transactionID);
|
XferUploaders.Remove(transactionID);
|
||||||
|
}
|
||||||
|
|
||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
@ -150,8 +183,14 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
m_dumpAssetToFile = dumpAssetToFile;
|
m_dumpAssetToFile = dumpAssetToFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Methods
|
/// <summary>
|
||||||
public void HandleXferPacket(ulong xferID, uint packetID, byte[] data)
|
/// Process transfer data received from the client.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xferID"></param>
|
||||||
|
/// <param name="packetID"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <returns>True if the transfer is complete, false otherwise or if the xferID was not valid</returns>
|
||||||
|
public bool HandleXferPacket(ulong xferID, uint packetID, byte[] data)
|
||||||
{
|
{
|
||||||
if (XferID == xferID)
|
if (XferID == xferID)
|
||||||
{
|
{
|
||||||
|
@ -175,11 +214,21 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
if ((packetID & 0x80000000) != 0)
|
if ((packetID & 0x80000000) != 0)
|
||||||
{
|
{
|
||||||
SendCompleteMessage();
|
SendCompleteMessage();
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data,
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialise asset transfer from the client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="xferID"></param>
|
||||||
|
/// <param name="packetID"></param>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <returns>True if the transfer is complete, false otherwise</returns>
|
||||||
|
public bool Initialise(IClientAPI remoteClient, LLUUID assetID, LLUUID transaction, sbyte type, byte[] data,
|
||||||
bool storeLocal, bool tempFile)
|
bool storeLocal, bool tempFile)
|
||||||
{
|
{
|
||||||
ourClient = remoteClient;
|
ourClient = remoteClient;
|
||||||
|
@ -198,11 +247,14 @@ namespace OpenSim.Framework.Communications.Cache
|
||||||
if (Asset.Data.Length > 2)
|
if (Asset.Data.Length > 2)
|
||||||
{
|
{
|
||||||
SendCompleteMessage();
|
SendCompleteMessage();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ReqestStartXfer();
|
ReqestStartXfer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void ReqestStartXfer()
|
protected void ReqestStartXfer()
|
||||||
|
|
Loading…
Reference in New Issue