summaryrefslogtreecommitdiff
path: root/indra/llfilesystem/lldiskcache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llfilesystem/lldiskcache.cpp')
-rw-r--r--indra/llfilesystem/lldiskcache.cpp70
1 files changed, 57 insertions, 13 deletions
diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index ee43a599f7..dd3852fb93 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -131,28 +131,44 @@ void LLDiskCache::purge()
LL_INFOS() << "Purging cache to a maximum of " << mMaxSizeBytes << " bytes" << LL_ENDL;
+ std::vector<bool> file_removed;
+ if (mEnableCacheDebugInfo)
+ {
+ file_removed.reserve(file_info.size());
+ }
uintmax_t file_size_total = 0;
for (file_info_t& entry : file_info)
{
file_size_total += entry.second.first;
- std::string action = "";
- if (file_size_total > mMaxSizeBytes)
+ bool should_remove = file_size_total > mMaxSizeBytes;
+ if (mEnableCacheDebugInfo)
+ {
+ file_removed.push_back(should_remove);
+ }
+ if (should_remove)
{
- action = "DELETE:";
boost::filesystem::remove(entry.second.second, ec);
if (ec.failed())
{
LL_WARNS() << "Failed to delete cache file " << entry.second.second << ": " << ec.message() << LL_ENDL;
}
}
- else
- {
- action = " KEEP:";
- }
+ }
- if (mEnableCacheDebugInfo)
+ if (mEnableCacheDebugInfo)
+ {
+ auto end_time = std::chrono::high_resolution_clock::now();
+ auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
+
+ // Log afterward so it doesn't affect the time measurement
+ // Logging thousands of file results can take hundreds of milliseconds
+ for (size_t i = 0; i < file_info.size(); ++i)
{
+ const file_info_t& entry = file_info[i];
+ const bool removed = file_removed[i];
+ const std::string action = removed ? "DELETE:" : "KEEP:";
+
// have to do this because of LL_INFO/LL_END weirdness
std::ostringstream line;
@@ -163,12 +179,7 @@ void LLDiskCache::purge()
line << " (" << file_size_total << "/" << mMaxSizeBytes << ")";
LL_INFOS() << line.str() << LL_ENDL;
}
- }
- if (mEnableCacheDebugInfo)
- {
- auto end_time = std::chrono::high_resolution_clock::now();
- auto execute_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
LL_INFOS() << "Total dir size after purge is " << dirFileSize(mCacheDir) << LL_ENDL;
LL_INFOS() << "Cache purge took " << execute_time << " ms to execute for " << file_info.size() << " files" << LL_ENDL;
}
@@ -209,6 +220,7 @@ const std::string LLDiskCache::assetTypeToString(LLAssetType::EType at)
{ LLAssetType::AT_PERSON, "PERSON" },
{ LLAssetType::AT_MESH, "MESH" },
{ LLAssetType::AT_SETTINGS, "SETTINGS" },
+ { LLAssetType::AT_MATERIAL, "MATERIAL" },
{ LLAssetType::AT_UNKNOWN, "UNKNOWN" }
};
@@ -354,6 +366,38 @@ void LLDiskCache::clearCache()
}
}
+void LLDiskCache::removeOldVFSFiles()
+{
+ //VFS files won't be created, so consider removing this code later
+ static const char CACHE_FORMAT[] = "inv.llsd";
+ static const char DB_FORMAT[] = "db2.x";
+
+ boost::system::error_code ec;
+#if LL_WINDOWS
+ std::wstring cache_path(utf8str_to_utf16str(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "")));
+#else
+ std::string cache_path(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""));
+#endif
+ if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())
+ {
+ for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {}))
+ {
+ if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed())
+ {
+ if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) ||
+ (entry.path().string().find(DB_FORMAT) != std::string::npos))
+ {
+ boost::filesystem::remove(entry, ec);
+ if (ec.failed())
+ {
+ LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL;
+ }
+ }
+ }
+ }
+ }
+}
+
uintmax_t LLDiskCache::dirFileSize(const std::string dir)
{
uintmax_t total_file_size = 0;