move floatsam write thread to objectjobengine

This commit is contained in:
UbitUmarov
2021-01-11 15:18:01 +00:00
parent 07e02ec7e6
commit 517d2e136b

View File

@@ -82,8 +82,7 @@ namespace OpenSim.Region.CoreModules.Asset
private ulong m_weakRefHits;
private static HashSet<string> m_CurrentlyWriting = new HashSet<string>();
private static BlockingCollection<WriteAssetInfo> m_assetFileWriteQueue = null;
private static CancellationTokenSource m_cancelSource;
private static ObjectJobEngine m_assetFileWriteWorker = null;
private static HashSet<string> m_defaultAssets = new HashSet<string>();
private bool m_FileCacheEnabled = true;
@@ -231,15 +230,20 @@ namespace OpenSim.Region.CoreModules.Asset
{
if(m_Scenes.Count <= 0)
{
if (m_assetFileWriteQueue != null)
lock (timerLock)
{
m_assetFileWriteQueue.Dispose();
m_assetFileWriteQueue = null;
}
if(m_cancelSource != null)
{
m_cancelSource.Dispose();
m_cancelSource = null;
m_cleanupRunning = false;
if (m_timerRunning)
{
m_timerRunning = false;
m_CacheCleanTimer.Stop();
m_CacheCleanTimer.Close();
}
if (m_assetFileWriteWorker != null)
{
m_assetFileWriteWorker.Dispose();
m_assetFileWriteWorker = null;
}
}
}
}
@@ -270,8 +274,11 @@ namespace OpenSim.Region.CoreModules.Asset
m_CacheCleanTimer.Stop();
m_CacheCleanTimer.Close();
}
if (m_FileCacheEnabled && m_assetFileWriteQueue != null)
m_cancelSource.Cancel();
if (m_assetFileWriteWorker != null)
{
m_assetFileWriteWorker.Dispose();
m_assetFileWriteWorker = null;
}
}
}
}
@@ -299,11 +306,9 @@ namespace OpenSim.Region.CoreModules.Asset
}
}
if (m_FileCacheEnabled && m_assetFileWriteQueue == null)
if (m_FileCacheEnabled && m_assetFileWriteWorker == null)
{
m_assetFileWriteQueue = new BlockingCollection<WriteAssetInfo>();
m_cancelSource = new CancellationTokenSource();
WorkManager.RunInThreadPool(ProcessWrites, null, "FloatsamCacheWriter", false);
m_assetFileWriteWorker = new ObjectJobEngine(ProcessWrites, "FloatsamCacheWriter", 1000 , 1);
}
if(!string.IsNullOrWhiteSpace(m_assetLoader) && scene.RegionInfo.RegionID == m_Scenes[0].RegionInfo.RegionID)
@@ -330,15 +335,10 @@ namespace OpenSim.Region.CoreModules.Asset
{
try
{
while(true)
{
if(m_assetFileWriteQueue.TryTake(out WriteAssetInfo wai,-1, m_cancelSource.Token))
{
WriteFileCache(wai.filename,wai.asset,wai.replace);
wai.asset = null;
Thread.Sleep(20);
}
}
WriteAssetInfo wai = (WriteAssetInfo)o;
WriteFileCache(wai.filename,wai.asset,wai.replace);
wai.asset = null;
Thread.Yield();
}
catch{ }
}
@@ -364,19 +364,13 @@ namespace OpenSim.Region.CoreModules.Asset
private void UpdateFileCache(string key, AssetBase asset, bool replace = false)
{
if(m_assetFileWriteQueue == null)
if(m_assetFileWriteWorker == null)
return;
string filename = GetFileName(key);
try
{
// If the file is already cached, don't cache it, just touch it so access time is updated
if (!replace && File.Exists(filename))
{
UpdateFileLastAccessTime(filename);
return;
}
// Once we start writing, make sure we flag that we're writing
// that object to the cache so that we don't try to write the
// same file multiple times.
@@ -388,15 +382,16 @@ namespace OpenSim.Region.CoreModules.Asset
m_CurrentlyWriting.Add(filename);
}
WriteAssetInfo wai = new WriteAssetInfo()
if (m_assetFileWriteWorker != null)
{
filename = filename,
asset = asset,
replace = replace
};
if (m_assetFileWriteQueue != null)
m_assetFileWriteQueue.Add(wai);
WriteAssetInfo wai = new WriteAssetInfo()
{
filename = filename,
asset = asset,
replace = replace
};
m_assetFileWriteWorker.Enqueue(wai);
}
}
catch (Exception e)
{
@@ -435,7 +430,7 @@ namespace OpenSim.Region.CoreModules.Asset
/// </summary>
/// <param name="filename">Filename.</param>
/// <returns><c>true</c>, if the update was successful, false otherwise.</returns>
private bool UpdateFileLastAccessTime(string filename)
private static bool UpdateFileLastAccessTime(string filename)
{
try
{
@@ -942,22 +937,24 @@ namespace OpenSim.Region.CoreModules.Asset
}
/// <summary>
/// Writes a file to the file cache, creating any nessesary
/// Writes a file to the file cache, creating any necessary
/// tier directories along the way
/// </summary>
/// <param name="filename"></param>
/// <param name="asset"></param>
private static void WriteFileCache(string filename, AssetBase asset, bool replace)
{
// Make sure the target cache directory exists
string directory = Path.GetDirectoryName(filename);
// Write file first to a temp name, so that it doesn't look
// like it's already cached while it's still writing.
string tempname = Path.Combine(directory, Path.GetRandomFileName());
try
{
// If the file is already cached, don't cache it, just touch it so access time is updated
if (!replace && File.Exists(filename))
{
UpdateFileLastAccessTime(filename);
return;
}
string directory = Path.GetDirectoryName(filename);
string tempname = Path.Combine(directory, Path.GetRandomFileName());
try
{
if (!Directory.Exists(directory))
@@ -965,7 +962,7 @@ namespace OpenSim.Region.CoreModules.Asset
Directory.CreateDirectory(directory);
}
using(Stream stream = File.Open(tempname, FileMode.Create))
using (Stream stream = File.Open(tempname, FileMode.Create))
{
BinaryFormatter bformatter = new BinaryFormatter();
bformatter.Serialize(stream, asset);