diff options
| -rw-r--r-- | indra/newview/llaisapi.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llappearancemgr.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llappearancemgr.h | 4 | ||||
| -rw-r--r-- | indra/newview/llavatarrendernotifier.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 72 | 
5 files changed, 59 insertions, 68 deletions
| diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 3e3d5c7456..648212177b 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -838,11 +838,11 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories)  void AISUpdate::doUpdate()  { -	// Do version/descendent accounting. +	// Do version/descendant accounting.  	for (std::map<LLUUID,S32>::const_iterator catit = mCatDescendentDeltas.begin();  		 catit != mCatDescendentDeltas.end(); ++catit)  	{ -		LL_DEBUGS("Inventory") << "descendent accounting for " << catit->first << LL_ENDL; +		LL_DEBUGS("Inventory") << "descendant accounting for " << catit->first << LL_ENDL;  		const LLUUID cat_id(catit->first);  		// Don't account for update if we just created this category. @@ -859,13 +859,13 @@ void AISUpdate::doUpdate()  			continue;  		} -		// If we have a known descendent count, set that now. +		// If we have a known descendant count, set that now.  		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);  		if (cat)  		{  			S32 descendent_delta = catit->second;  			S32 old_count = cat->getDescendentCount(); -			LL_DEBUGS("Inventory") << "Updating descendent count for " +			LL_DEBUGS("Inventory") << "Updating descendant count for "  								   << cat->getName() << " " << cat_id  								   << " with delta " << descendent_delta << " from "  								   << old_count << " to " << (old_count+descendent_delta) << LL_ENDL; @@ -896,7 +896,7 @@ void AISUpdate::doUpdate()  		LLUUID category_id(update_it->first);  		LLPointer<LLViewerInventoryCategory> new_category = update_it->second;  		// Since this is a copy of the category *before* the accounting update, above, -		// we need to transfer back the updated version/descendent count. +		// we need to transfer back the updated version/descendant count.  		LLViewerInventoryCategory* curr_cat = gInventory.getCategory(new_category->getUUID());  		if (!curr_cat)  		{ @@ -961,7 +961,16 @@ void AISUpdate::doUpdate()  		{  			LL_WARNS() << "Possible version mismatch for category " << cat->getName()  					<< ", viewer version " << cat->getVersion() -					<< " server version " << version << LL_ENDL; +					<< " AIS version " << version << " !!!Adjusting local version!!!" <<  LL_ENDL; + +            // the AIS version should be considered the true version. Adjust  +            // our local category model to reflect this version number.  Otherwise  +            // it becomes possible to get stuck with the viewer being out of  +            // sync with the inventory system.  Under normal circumstances  +            // inventory COF is maintained on the viewer through calls to  +            // LLInventoryModel::accountForUpdate when a changing operation  +            // is performed.  This occasionally gets out of sync however. +            cat->setVersion(version);  		}  	} diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index cc676550ab..a1d9786321 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -60,6 +60,8 @@  #include "llcoros.h"  #include "lleventcoro.h" +#include "llavatarpropertiesprocessor.h" +  #if LL_MSVC  // disable boost::lexical_cast warning  #pragma warning (disable:4702) @@ -3359,15 +3361,9 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()  {      if (!mOutstandingAppearanceBakeRequest)      { -#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE          mRerequestAppearanceBake = false;          LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);          LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc); -#else -        LLCoros::instance().launch("serverAppearanceUpdateCoro",  -            boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this)); - -#endif      }      else      { @@ -3375,17 +3371,8 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()      }  } -#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE  void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter) -#else -void LLAppearanceMgr::serverAppearanceUpdateCoro() -#endif  { -#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE -    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter( -        new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID)); -#endif -      mRerequestAppearanceBake = false;      if (!gAgent.getRegion())      { @@ -3493,10 +3480,15 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro()              // on multiple machines.              if (result.has("expected"))              { -                  S32 expectedCofVersion = result["expected"].asInteger();                  LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL; +                // Force an update texture request for ourself.  The message will return +                // through the UDP and be handled in LLVOAvatar::processAvatarAppearance +                // this should ensure that we receive a new canonical COF from the sim +                // host. Hopefully it will return before the timeout. +                LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(gAgent.getID()); +                  bRetry = true;                  // Wait for a 1/2 second before trying again.  Just to keep from asking too quickly.                  if (++retryCount > BAKE_RETRY_MAX_COUNT) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index bf181cb4ad..7069da7352 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -228,11 +228,7 @@ public:  private: -#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE      void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter); -#else -    void serverAppearanceUpdateCoro(); -#endif      static void debugAppearanceUpdateCOF(const LLSD& content); diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp index a13e142e16..24934fdb73 100644 --- a/indra/newview/llavatarrendernotifier.cpp +++ b/indra/newview/llavatarrendernotifier.cpp @@ -63,7 +63,7 @@ mLatestAgentComplexity(0),  mLatestOverLimitPct(0.0f),  mShowOverLimitAgents(false),  mNotifyOutfitLoading(false), -mLastCofVersion(-1), +mLastCofVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),  mLastOutfitRezStatus(-1),  mLastSkeletonSerialNum(-1)  { @@ -207,8 +207,8 @@ void LLAvatarRenderNotifier::updateNotificationState()          mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;      }      else if (mLastCofVersion >= 0 -        && (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion -            || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum)) +        && (mLastCofVersion != LLAppearanceMgr::instance().getCOFVersion() +        || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))      {          // version mismatch in comparison to previous outfit - outfit changed          mNotifyOutfitLoading = true; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b9dd43f061..672d153e51 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -7313,7 +7313,6 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32  //-----------------------------------------------------------------------------  void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  { -    static S32 largestSelfCOFSeen(LLViewerInventoryCategory::VERSION_UNKNOWN);  	LL_DEBUGS("Avatar") << "starts" << LL_ENDL;  	bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"); @@ -7348,43 +7347,34 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		return;  	} -	S32 this_update_cof_version = contents.mCOFVersion; -	S32 last_update_request_cof_version = mLastUpdateRequestCOFVersion; +    S32 thisAppearanceVersion(contents.mCOFVersion); +    if (isSelf()) +    {   // In the past this was considered to be the canonical COF version,  +        // that is no longer the case.  The canonical version is maintained  +        // by the AIS code and should match the COF version there. Even so, +        // we must prevent rolling this one backwards backwards or processing  +        // stale versions. -	if( isSelf() ) -	{ -		LL_DEBUGS("Avatar") << "this_update_cof_version " << this_update_cof_version -				<< " last_update_request_cof_version " << last_update_request_cof_version -				<<  " my_cof_version " << LLAppearanceMgr::instance().getCOFVersion() << LL_ENDL; +        S32 aisCOFVersion(LLAppearanceMgr::instance().getCOFVersion()); + +        LL_DEBUGS("Avatar") << "handling self appearance message #" << thisAppearanceVersion << +            " (highest seen #" << mLastUpdateReceivedCOFVersion << +            ") (AISCOF=#" << aisCOFVersion << ")" << LL_ENDL; -        if (largestSelfCOFSeen > this_update_cof_version) +        if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)          { -            LL_WARNS("Avatar") << "Already processed appearance for COF version " << -                largestSelfCOFSeen << ", discarding appearance with COF " << this_update_cof_version << LL_ENDL; +            LL_WARNS("Avatar") << "Stale appearance received #" << thisAppearanceVersion << +                " attempt to roll back from #" << mLastUpdateReceivedCOFVersion << +                "... dropping." << LL_ENDL; +            return; +        } +        if (isEditingAppearance()) +        { +            LL_DEBUGS("Avatar") << "Editing appearance.  Dropping appearance update." << LL_ENDL;              return;          } -        largestSelfCOFSeen = this_update_cof_version; - -	} -	else -	{ -		LL_DEBUGS("Avatar") << "appearance message received" << LL_ENDL; -	} - -	// Check for stale update. -	if (isSelf() -		&& (this_update_cof_version < last_update_request_cof_version)) -	{ -		LL_WARNS() << "Stale appearance update, wanted version " << last_update_request_cof_version -				<< ", got " << this_update_cof_version << LL_ENDL; -		return; -	} -	if (isSelf() && isEditingAppearance()) -	{ -		LL_DEBUGS("Avatar") << "ignoring appearance message while in appearance edit" << LL_ENDL; -		return; -	} +    }  	// SUNSHINE CLEANUP - is this case OK now?  	S32 num_params = contents.mParamWeights.size(); @@ -7399,13 +7389,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	}  	// No backsies zone - if we get here, the message should be valid and usable, will be processed. -    LL_INFOS("Avatar") << "Processing appearance message version " << this_update_cof_version << LL_ENDL; +    LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL; -	// Note: -	// RequestAgentUpdateAppearanceResponder::onRequestRequested() -	// assumes that cof version is only updated with server-bake -	// appearance messages. -	mLastUpdateReceivedCOFVersion = this_update_cof_version; +    if (isSelf()) +    { +        // Note: +        // locally the COF is maintained via LLInventoryModel::accountForUpdate +        // which is called from various places.  This should match the simhost's  +        // idea of what the COF version is.  AIS however maintains its own version +        // of the COF that should be considered canonical.  +        mLastUpdateReceivedCOFVersion = thisAppearanceVersion; +    }      if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))      { @@ -7528,7 +7522,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  		// Got an update for some other avatar  		// Ignore updates for self, because we have a more authoritative value in the preferences.  		setHoverOffset(contents.mHoverOffset); -		LL_INFOS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL; +		LL_DEBUGS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;  	}  	if (!contents.mHoverOffsetWasSet && !isSelf()) | 
