diff options
| author | Rider Linden <rider@lindenlab.com> | 2016-02-25 11:49:01 -0800 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2016-02-25 11:49:01 -0800 | 
| commit | 5093fe3da1f245817e51db5100070374bc278fe1 (patch) | |
| tree | b3b89ae71ca5d71538e7e0203a333fe31ec678fd | |
| parent | 953b8ed694c2b5a2762e829e2ecf56fe07c23619 (diff) | |
MAINT-5693: Some bake requests were getting lost. If a bake request is made while another one is outstanding rather than launch the new one, set a flag and remake the request with new data.
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 209 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 2 | 
2 files changed, 123 insertions, 88 deletions
| diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ec6154913b..ec0b7c9a8e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3354,123 +3354,154 @@ LLSD LLAppearanceMgr::dumpCOF() const  void LLAppearanceMgr::requestServerAppearanceUpdate()  { -    LLCoros::instance().launch("LLAppearanceMgr::serverAppearanceUpdateCoro", -        boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this)); -} - -void LLAppearanceMgr::serverAppearanceUpdateCoro() -{ -    // If we have already received an update for this or higher cof version, ignore. -    S32 cofVersion = getCOFVersion(); -    S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion; -    S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion; - -    //---------------- -    // move out of coroutine -    if (!gAgent.getRegion()) +    if (!mIsServerBakeOutstanding)      { -        LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL; -        return; +        LLCoros::instance().launch("LLAppearanceMgr::serverAppearanceUpdateCoro", +            boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));      } -    if (gAgent.getRegion()->getCentralBakeVersion() == 0) +    else      { -        LL_WARNS("Avatar") << "Region does not support baking" << LL_ENDL; +        LL_WARNS("Avatar") << "Server bake request would overlap outstanding request " << +            " requesting new bake when ready." << LL_ENDL; +        mNewServerBakeRequested = true;      } +} -    std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance"); -    if (url.empty()) -    { -        LL_WARNS("Agent") << "Could not retrieve region capability \"UpdateAvatarAppearance\"" << LL_ENDL; -    } +void LLAppearanceMgr::serverAppearanceUpdateCoro() +{ +    BoolSetter inFlight(mIsServerBakeOutstanding); -    //---------------- -    if (gAgentAvatarp->isEditingAppearance()) +    do      { -        LL_WARNS("Avatar") << "Avatar editing appearance, not sending request." << LL_ENDL; -        // don't send out appearance updates if in appearance editing mode -        return; -    } - -    LL_DEBUGS("Avatar") << "COF version=" << cofVersion << -        " last_rcv=" << lastRcv << -        " last_req=" << lastReq << LL_ENDL; +#if 0 +        static int reqcount = 0; +        int r_count = ++reqcount; +        LL_WARNS("Avatar") << "START: Server Bake request #" << r_count << "!" << LL_ENDL; +#endif -    if (cofVersion < lastRcv) -    { -        LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv -            << " will not request for " << cofVersion << LL_ENDL; -        return; -    } -    if (lastReq >= cofVersion) -    { -        LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq -            << " will not request for " << cofVersion << LL_ENDL; -        return; -    } +        // If we have already received an update for this or higher cof version, ignore. +        S32 cofVersion = getCOFVersion(); +        S32 lastRcv = gAgentAvatarp->mLastUpdateReceivedCOFVersion; +        S32 lastReq = gAgentAvatarp->mLastUpdateRequestCOFVersion; -    // Actually send the request. -    LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL; +        mNewServerBakeRequested = false; +        //---------------- +        // move out of coroutine +        if (!gAgent.getRegion()) +        { +            LL_WARNS("Avatar") << "Region not set, cannot request server appearance update" << LL_ENDL; +            return; +        } +        if (gAgent.getRegion()->getCentralBakeVersion() == 0) +        { +            LL_WARNS("Avatar") << "Region does not support baking" << LL_ENDL; +        } -    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter( -        "UpdateAvatarAppearance", gAgent.getAgentPolicy())); +        std::string url = gAgent.getRegion()->getCapability("UpdateAvatarAppearance"); +        if (url.empty()) +        { +            LL_WARNS("Agent") << "Could not retrieve region capability \"UpdateAvatarAppearance\"" << LL_ENDL; +        } -    S32 reqCofVersion = cofVersion; -    if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) -    { -        reqCofVersion += 999; -        LL_WARNS("Avatar") << "Forcing version failure on COF Baking" << LL_ENDL; -    } +        //---------------- +        if (gAgentAvatarp->isEditingAppearance()) +        { +            LL_WARNS("Avatar") << "Avatar editing appearance, not sending request." << LL_ENDL; +            // don't send out appearance updates if in appearance editing mode +            return; +        } -    do  -    { -        LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); +        LL_DEBUGS("Avatar") << "COF version=" << cofVersion << +                " last_rcv=" << lastRcv << +                " last_req=" << lastReq << LL_ENDL; -        LLSD postData; -        if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate")) +        if (cofVersion < lastRcv)          { -            postData = dumpCOF(); +            LL_WARNS("Avatar") << "Have already received update for cof version " << lastRcv +                    << " will not request for " << cofVersion << LL_ENDL; +            return;          } -        else +        if (lastReq >= cofVersion)          { -            postData["cof_version"] = reqCofVersion; +            LL_WARNS("Avatar") << "Request already in flight for cof version " << lastReq +                    << " will not request for " << cofVersion << LL_ENDL; +            return;          } -        gAgentAvatarp->mLastUpdateRequestCOFVersion = reqCofVersion; +        // Actually send the request. +        LL_DEBUGS("Avatar") << "Will send request for cof_version " << cofVersion << LL_ENDL; -        LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData); +        LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter( +        "UpdateAvatarAppearance", gAgent.getAgentPolicy())); -        LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; -        LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); +        S32 reqCofVersion = cofVersion; +        if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) +        { +            reqCofVersion += 999; +            LL_WARNS("Avatar") << "Forcing version failure on COF Baking" << LL_ENDL; +        } -        if (!status || !result["success"].asBoolean()) +        do          { -            std::string message = (result.has("error")) ? result["error"].asString() : status.toString(); -            LL_WARNS("Avatar") << "Appearance Failure. server responded with \"" << message << "\"" << LL_ENDL; - -            // We may have requested a bake for a stale COF (especially if the inventory  -            // is still updating.  If that is the case re send the request with the  -            // corrected COF version.  (This may also be the case if the viewer is running  -            // on multiple machines. -            if (result.has("expected")) +            LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); + +            LLSD postData; +            if (gSavedSettings.getBOOL("DebugAvatarExperimentalServerAppearanceUpdate"))              { -                reqCofVersion = result["expected"].asInteger(); +                postData = dumpCOF(); +            } +            else +            { +                postData["cof_version"] = reqCofVersion; +            } -                LL_WARNS("Avatar") << "Will Retry with expected COF value of " << reqCofVersion << LL_ENDL; -                continue; +            gAgentAvatarp->mLastUpdateRequestCOFVersion = reqCofVersion; + +            LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData); + +            LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +            LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +            if (!status || !result["success"].asBoolean()) +            { +                std::string message = (result.has("error")) ? result["error"].asString() : status.toString(); +                LL_WARNS("Avatar") << "Appearance Failure. server responded with \"" << message << "\"" << LL_ENDL; + +                // We may have requested a bake for a stale COF (especially if the inventory  +                // is still updating.  If that is the case re send the request with the  +                // corrected COF version.  (This may also be the case if the viewer is running  +                // on multiple machines. +                if (result.has("expected")) +                { +                    reqCofVersion = result["expected"].asInteger(); + +                    LL_WARNS("Avatar") << "Will Retry with expected COF value of " << reqCofVersion << LL_ENDL; +                    continue; +                } + +                break; +            } + +            LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL; +            if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +            { +                dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", result);              }              break; -        } +        } while (true); -        LL_DEBUGS("Avatar") << "succeeded" << LL_ENDL; -        if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +#if 0 +        LL_WARNS("Avatar") << "END: Server Bake request #" << r_count << "!" << LL_ENDL; +#endif + +        // if someone requested a server bake before the previous one was finished +        // repeate the process. +        if (mNewServerBakeRequested)          { -            dump_sequential_xml(gAgentAvatarp->getFullname() + "_appearance_request_ok", result); +            LL_WARNS("Avatar") << "New bake request received while processing previous one. Re-requesting." << LL_ENDL;          } - -        break; -    } while (true); - +    } while (mNewServerBakeRequested);  }  /*static*/ @@ -3838,7 +3869,9 @@ LLAppearanceMgr::LLAppearanceMgr():  	mOutfitLocked(false),  	mInFlightCounter(0),  	mInFlightTimer(), -	mIsInUpdateAppearanceFromCOF(false) +	mIsInUpdateAppearanceFromCOF(false), +    mIsServerBakeOutstanding(false), +    mNewServerBakeRequested(false)  {  	LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();  	// unlock outfit on save operation completed diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 118648b7c3..ebe564c3ea 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -254,6 +254,8 @@ private:  	bool mAttachmentInvLinkEnabled;  	bool mOutfitIsDirty;  	bool mIsInUpdateAppearanceFromCOF; // to detect recursive calls. +    bool mIsServerBakeOutstanding;      // A server texture bake has been sent to the server and we are waiting on a response. +    bool mNewServerBakeRequested;       // A server texture bake has been requested, but there is already one outstanding.  	/**  	 * Lock for blocking operations on outfit until server reply or timeout exceed | 
