diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index a37c457092..c11338766e 100755 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -82,8 +82,7 @@ namespace OpenSim.Region.CoreModules.Asset private ulong m_weakRefHits; private static HashSet m_CurrentlyWriting = new HashSet(); - private static BlockingCollection m_assetFileWriteQueue = null; - private static CancellationTokenSource m_cancelSource; + private static ObjectJobEngine m_assetFileWriteWorker = null; private static HashSet m_defaultAssets = new HashSet(); 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(); - 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 /// /// Filename. /// true, if the update was successful, false otherwise. - private bool UpdateFileLastAccessTime(string filename) + private static bool UpdateFileLastAccessTime(string filename) { try { @@ -942,22 +937,24 @@ namespace OpenSim.Region.CoreModules.Asset } /// - /// 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 /// /// /// 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);