diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index f2a5726529..51ca715c7e 100755 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs @@ -696,7 +696,7 @@ namespace OpenSim.Region.CoreModules.Asset long heap = 0; //if (m_LogLevel >= 2) { - m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Start Check for expired files older then {0}.", m_FileExpiration); + m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Start Check for expired files older then {0}.", m_FileExpiration); heap = GC.GetTotalMemory(false); } @@ -708,7 +708,7 @@ namespace OpenSim.Region.CoreModules.Asset int cooldown = 0; m_log.Info("[FLOTSAM ASSET CACHE] do asset files expire"); foreach (string subdir in Directory.GetDirectories(m_CacheDirectory)) - CleanExpiredFiles(subdir, gids, purgeLine, ref cooldown); + cooldown = await CleanExpiredFiles(subdir, gids, purgeLine, cooldown); lock (timerLock) { @@ -720,7 +720,7 @@ namespace OpenSim.Region.CoreModules.Asset { heap = GC.GetTotalMemory(false) - heap; double fheap = Math.Round((double)(heap / (1024 * 1024)), 3); - m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Finished Check for expired files, heap delta: {0}MB.", fheap); + m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Finished Check for expired files, heap delta: {0}MB.", fheap); } } @@ -731,78 +731,19 @@ namespace OpenSim.Region.CoreModules.Asset /// /// /// - private void CleanExpiredFiles(string dir, DateTime purgeLine, ref int cooldown) - { - try - { - if(!Directory.Exists(dir)) - return; - - int dirSize = 0; - foreach (string file in Directory.GetFiles(dir)) - { - ++dirSize; - if (File.GetLastAccessTime(file) < purgeLine) - { - File.Delete(file); - cooldown += 2; - string id = Path.GetFileName(file); - if(!String.IsNullOrEmpty(id)) - { - lock (weakAssetReferencesLock) - weakAssetReferences.Remove(id); - } - } - if(++cooldown >= 30) - { - Thread.Sleep(50); - cooldown = 0; - } - } - - // Recurse into lower tiers - foreach (string subdir in Directory.GetDirectories(dir)) - { - ++dirSize; - CleanExpiredFiles(subdir, purgeLine, ref cooldown); - } - - // Check if a tier directory is empty, if so, delete it - if (dirSize == 0) - { - Directory.Delete(dir); - } - else if (dirSize >= m_CacheWarnAt) - { - m_log.WarnFormat( - "[FLOTSAM ASSET CACHE]: Cache folder exceeded CacheWarnAt limit {0} {1}. Suggest increasing tiers, tier length, or reducing cache expiration", - dir, dirSize); - } - } - catch (DirectoryNotFoundException) - { - // If we get here, another node on the same box has - // already removed the directory. Continue with next. - } - catch (Exception e) - { - m_log.WarnFormat("[FLOTSAM ASSET CACHE]: Could not complete clean of expired files in {0}, exception {1}", dir, e.Message); - } - } - - private void CleanExpiredFiles(string dir, Dictionary gids, DateTime purgeLine, ref int cooldown) + private async Task CleanExpiredFiles(string dir, Dictionary gids, DateTime purgeLine, int cooldown) { try { if (!Directory.Exists(dir)) - return; + return cooldown; int dirSize = 0; foreach (string file in Directory.GetFiles(dir)) { if (!m_cleanupRunning) - return; + return cooldown; ++dirSize; string id = Path.GetFileName(file); @@ -819,9 +760,9 @@ namespace OpenSim.Region.CoreModules.Asset lock (weakAssetReferencesLock) weakAssetReferences.Remove(id); } - if (++cooldown >= 30) + if (++cooldown >= 20) { - Thread.Sleep(50); + await Task.Delay(60).ConfigureAwait(false); cooldown = 0; } } @@ -830,10 +771,10 @@ namespace OpenSim.Region.CoreModules.Asset foreach (string subdir in Directory.GetDirectories(dir)) { if (!m_cleanupRunning) - return; + return cooldown; ++dirSize; - CleanExpiredFiles(subdir, gids, purgeLine, ref cooldown); + cooldown = await CleanExpiredFiles(subdir, gids, purgeLine, cooldown); } // Check if a tier directory is empty, if so, delete it @@ -857,6 +798,7 @@ namespace OpenSim.Region.CoreModules.Asset { m_log.WarnFormat("[FLOTSAM ASSET CACHE]: Could not complete clean of expired files in {0}, exception {1}", dir, e.Message); } + return cooldown; } /// @@ -1059,7 +1001,6 @@ namespace OpenSim.Region.CoreModules.Asset int cooldown = 0; foreach (Scene s in m_Scenes) { - StampRegionStatusFile(s.RegionInfo.RegionID); gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture1, (sbyte)AssetType.Texture); gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture2, (sbyte)AssetType.Texture); gatherer.AddGathered(s.RegionInfo.RegionSettings.TerrainTexture3, (sbyte)AssetType.Texture); @@ -1111,6 +1052,8 @@ namespace OpenSim.Region.CoreModules.Asset entities = null; if (!m_cleanupRunning) break; + + StampRegionStatusFile(s.RegionInfo.RegionID); } gatherer.GatherAll();