summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoren Shih <seraph@lindenlab.com>2010-01-14 13:54:15 -0500
committerLoren Shih <seraph@lindenlab.com>2010-01-14 13:54:15 -0500
commitb134bf554d7f7efaec61a4846531a0a1da094e12 (patch)
tree4e7a43fe2d538cde3264678763e05ab10d5d526d
parente1105245371e7c34c1be7a772906d3c2f6ca258d (diff)
EXT-4319 : Category descendent count fails to increment if descendent received while cat still fetching
EXT-4320 : Mismatch in folder descendents count is causing fetch descendents to never complete EXT-2244 : My Outfits bars should be populated from Library on first 2.0 login Implemented a workaround for an issue where descendent count was becoming unsynchronized. EXT-4320 is the workaround, this solves for EXT-2244, and EXT-4319 is the actual bug (whose fix is still pending).
-rw-r--r--indra/newview/llinventorymodel.cpp8
-rw-r--r--indra/newview/llinventoryobserver.cpp35
2 files changed, 29 insertions, 14 deletions
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 711114173c..a468a9a95c 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2001,14 +2001,16 @@ void LLInventoryModel::accountForUpdate(const LLCategoryUpdate& update) const
}
if(!accounted)
{
- lldebugs << "No accounting for: '" << cat->getName() << "' "
+ // Error condition, this means that the category did not register that
+ // it got new descendents (perhaps because it is still being loaded)
+ // which means its descendent count will be wrong.
+ llwarns << "Accounting failed for '" << cat->getName() << "' version:"
<< version << llendl;
}
}
else
{
- llwarns << "No category found for update " << update.mCategoryID
- << llendl;
+ llwarns << "No category found for update " << update.mCategoryID << llendl;
}
}
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 2d9ea21b5f..2fb8aea4e9 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -311,10 +311,10 @@ bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
{
- S32 version = cat->getVersion();
- S32 descendents = cat->getDescendentCount();
- if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
- || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
+ const S32 version = cat->getVersion();
+ const S32 expected_num_descendents = cat->getDescendentCount();
+ if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) ||
+ (expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN))
{
return false;
}
@@ -325,15 +325,28 @@ bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory*
gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
if(!cats || !items)
{
- // bit of a hack - pretend we're done if they are gone or
- // incomplete. should never know, but it would suck if this
- // kept tight looping because of a corrupt memory state.
+ llwarns << "Category '" << cat->getName() << "' descendents corrupted, fetch failed." << llendl;
+ // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
+ // that the cat just doesn't have any items or subfolders).
+ // Unrecoverable, so just return done so that this observer can be cleared
+ // from memory.
return true;
}
- S32 known = cats->count() + items->count();
- if(descendents == known)
+ const S32 current_num_known_descendents = cats->count() + items->count();
+
+ // Got the number of descendents that we were expecting, so we're done.
+ if (current_num_known_descendents == expected_num_descendents)
+ {
+ return true;
+ }
+
+ // Error condition, but recoverable. This happens if something was added to the
+ // category before it was initialized, so accountForUpdate didn't update descendent
+ // count and thus the category thinks it has fewer descendents than it actually has.
+ if (current_num_known_descendents >= expected_num_descendents)
{
- // hey - we're done.
+ llwarns << "Category '" << cat->getName() << "' expected descendentcount:" << expected_num_descendents << " descendents but got descendentcount:" << current_num_known_descendents << llendl;
+ cat->setDescendentCount(current_num_known_descendents);
return true;
}
return false;
@@ -352,7 +365,7 @@ void LLInventoryFetchComboObserver::changed(U32 mask)
continue;
}
if(item->isComplete())
- {
+ {
mCompleteItems.push_back(*it);
it = mIncompleteItems.erase(it);
continue;