From 2b6a8698c1b979c4ea3130a36eeabaa415bcec36 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 4 Jul 2021 03:13:43 +0100 Subject: [PATCH] flotsam cache: reduce number of calls to File.SetLastAccessTime, (if that option is enabled ) --- .../CoreModules/Asset/FlotsamAssetCache.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 6a0d2c6a04..29b047cce6 100755 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -115,6 +115,8 @@ namespace OpenSim.Region.CoreModules.Asset private readonly object weakAssetReferencesLock = new object(); private bool m_updateFileTimeOnCacheHit = false; + private static ExpiringKey m_lastFileAccessTimeChange = null; + public FlotsamAssetCache() { List invalidChars = new List(); @@ -183,6 +185,9 @@ namespace OpenSim.Region.CoreModules.Asset m_CacheWarnAt = assetConfig.GetInt("CacheWarnAt", m_CacheWarnAt); } + if(m_updateFileTimeOnCacheHit) + m_lastFileAccessTimeChange = new ExpiringKey(300000); + if(m_MemoryCacheEnabled) m_MemoryCache = new ExpiringCacheOS((int)m_MemoryExpiration * 500); @@ -430,11 +435,12 @@ namespace OpenSim.Region.CoreModules.Asset /// /// Filename. /// true, if the update was successful, false otherwise. - private static bool UpdateFileLastAccessTime(string filename) + private static bool CheckUpdateFileLastAccessTime(string filename) { try { File.SetLastAccessTime(filename, DateTime.Now); + m_lastFileAccessTimeChange.Add(filename, 900000); return true; } catch (FileNotFoundException) @@ -447,6 +453,21 @@ namespace OpenSim.Region.CoreModules.Asset } } + private static void UpdateFileLastAccessTime(string filename) + { + try + { + if(!m_lastFileAccessTimeChange.ContainsKey(filename)) + { + File.SetLastAccessTime(filename, DateTime.Now); + m_lastFileAccessTimeChange.Add(filename, 900000); + } + } + catch + { + } + } + private AssetBase GetFromWeakReference(string id) { AssetBase asset = null; @@ -974,6 +995,7 @@ namespace OpenSim.Region.CoreModules.Asset bformatter.Serialize(stream, asset); stream.Flush(); } + m_lastFileAccessTimeChange.Add(filename, 900000); } catch (IOException e) { @@ -1096,7 +1118,7 @@ namespace OpenSim.Region.CoreModules.Asset break; string idstr = id.ToString(); - if (!UpdateFileLastAccessTime(GetFileName(idstr)) && tryGetUncached) + if (tryGetUncached && !CheckUpdateFileLastAccessTime(GetFileName(idstr))) { cooldown += 5; m_AssetService.Get(idstr);