mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 01:35:46 +08:00
move floatsam write thread to objectjobengine
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user