Skip to content
Snippets Groups Projects
Commit 1d4a6d14 authored by Brad Payne (Vir Linden)'s avatar Brad Payne (Vir Linden)
Browse files

For EXT-2325: Should purge inventory cache moving from 1.23 to 2.0.

Added a version field at the beginning of inventory cache files.  If version field is not found or does not match expectected value, then the cache is discarded.  In 1.23, the version line triggers a warning but is otherwise ignored.

Reviewed by Seraph.
parent c1899435
No related branches found
No related tags found
No related merge requests found
......@@ -81,6 +81,10 @@ BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
LLFrameTimer LLInventoryModel::sFetchTimer;
S16 LLInventoryModel::sBulkFetchCount = 0;
// Increment this if the inventory contents change in a non-backwards-compatible way.
// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
const S32 LLInventoryModel::sCurrentInvCacheVersion = 2;
// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue
static std::deque<LLUUID> sFetchQueue;
......@@ -2101,7 +2105,8 @@ bool LLInventoryModel::loadSkeleton(
llinfos << "Unable to gunzip " << gzip_filename << llendl;
}
}
if(loadFromFile(inventory_filename, categories, items))
bool is_cache_obsolete = false;
if(loadFromFile(inventory_filename, categories, items, is_cache_obsolete))
{
// We were able to find a cache of files. So, use what we
// found to generate a set of categories we should add. We
......@@ -2236,6 +2241,12 @@ bool LLInventoryModel::loadSkeleton(
// clean up the gunzipped file.
LLFile::remove(inventory_filename);
}
if(is_cache_obsolete)
{
// If out of date, remove the gzipped file too.
llwarns << "Inv cache out of date, removing" << llendl;
LLFile::remove(gzip_filename);
}
categories.clear(); // will unref and delete entries
}
......@@ -2634,7 +2645,8 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const
// static
bool LLInventoryModel::loadFromFile(const std::string& filename,
LLInventoryModel::cat_array_t& categories,
LLInventoryModel::item_array_t& items)
LLInventoryModel::item_array_t& items,
bool &is_cache_obsolete)
{
if(filename.empty())
{
......@@ -2651,11 +2663,32 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
// *NOTE: This buffer size is hard coded into scanf() below.
char buffer[MAX_STRING]; /*Flawfinder: ignore*/
char keyword[MAX_STRING]; /*Flawfinder: ignore*/
char value[MAX_STRING]; /*Flawfinder: ignore*/
is_cache_obsolete = true; // Obsolete until proven current
while(!feof(file) && fgets(buffer, MAX_STRING, file))
{
sscanf(buffer, " %254s", keyword); /* Flawfinder: ignore */
if(0 == strcmp("inv_category", keyword))
sscanf(buffer, " %126s %126s", keyword, value); /* Flawfinder: ignore */
if(0 == strcmp("inv_cache_version", keyword))
{
S32 version;
int succ = sscanf(value,"%d",&version);
if ((1 == succ) && (version == sCurrentInvCacheVersion))
{
// Cache is up to date
is_cache_obsolete = false;
continue;
}
else
{
// Cache is out of date
break;
}
}
else if(0 == strcmp("inv_category", keyword))
{
if (is_cache_obsolete)
break;
LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null);
if(inv_cat->importFileLocal(file))
{
......@@ -2669,6 +2702,9 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
else if(0 == strcmp("inv_item", keyword))
{
if (is_cache_obsolete)
break;
LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem;
if( inv_item->importFileLocal(file) )
{
......@@ -2700,6 +2736,8 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,
}
}
fclose(file);
if (is_cache_obsolete)
return false;
return true;
}
......@@ -2721,6 +2759,7 @@ bool LLInventoryModel::saveToFile(const std::string& filename,
return false;
}
fprintf(file, "\tinv_cache_version\t%d\n",sCurrentInvCacheVersion);
S32 count = categories.count();
S32 i;
for(i = 0; i < count; ++i)
......
......@@ -446,7 +446,8 @@ class LLInventoryModel
// file import/export.
static bool loadFromFile(const std::string& filename,
cat_array_t& categories,
item_array_t& items);
item_array_t& items,
bool& is_cache_obsolete);
static bool saveToFile(const std::string& filename,
const cat_array_t& categories,
const item_array_t& items);
......@@ -518,6 +519,9 @@ class LLInventoryModel
static F32 sMaxTimeBetweenFetches;
static S16 sBulkFetchCount;
// Expected inventory cache version
const static S32 sCurrentInvCacheVersion;
// This flag is used to handle an invalid inventory state.
bool mIsAgentInvUsable;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment