diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-01-06 00:19:05 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-01-06 00:27:23 +0200 | 
| commit | 3032ef97a935a1d2cda81c7d89c34c08aa93a5f9 (patch) | |
| tree | c48535a6666917dc061048c60954a3d54ef920f9 /indra | |
| parent | b6f36a61593fd249a15d8597c2d1ed1e87967b3a (diff) | |
SL-16593 Viewer login gets stuck requesting caps
Error happens before viewer enters STATE_SEED_GRANTED_WAIT, so couldn't bypass straight to STATE_SEED_CAP_GRANTED and had to implement an error state. But in this case might be better to fail login immediately.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llstartup.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.cpp | 40 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.h | 12 | 
3 files changed, 44 insertions, 22 deletions
| diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 54f3e6305c..9e4ba1debf 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -251,6 +251,7 @@ static bool mLoginStatePastUI = false;  static bool mBenefitsSuccessfullyInit = false;  const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds +const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; // Give region 3 chances  boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));  boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); @@ -1350,10 +1351,21 @@ bool idle_startup()  		{  			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );  		} +        else if (regionp->capabilitiesError()) +        { +            // Try to connect despite capabilities' error state +            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); +        }  		else  		{  			U32 num_retries = regionp->getNumSeedCapRetries(); -			if (num_retries > 0) +            if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN) +            { +                // Region will keep trying to get capabilities, +                // but for now continue as if caps were granted +                LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); +            } +			else if (num_retries > 0)  			{  				LLStringUtil::format_map_t args;  				args["[NUMBER]"] = llformat("%d", num_retries + 1); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 0f409701d1..3c2ebc9fef 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -95,8 +95,6 @@  // The server only keeps our pending agent info for 60 seconds.  // We want to allow for seed cap retry, but its not useful after that 60 seconds. -// Give it 3 chances, each at 18 seconds to give ourselves a few seconds to connect anyways if we give up. -const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3;  // Even though we gave up on login, keep trying for caps after we are logged in:  const S32 MAX_CAP_REQUEST_ATTEMPTS = 30;  const U32 DEFAULT_MAX_REGION_WIDE_PRIM_COUNT = 15000; @@ -178,7 +176,6 @@ public:          mCompositionp(NULL),          mEventPoll(NULL),          mSeedCapMaxAttempts(MAX_CAP_REQUEST_ATTEMPTS), -        mSeedCapMaxAttemptsBeforeLogin(MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN),          mSeedCapAttempts(0),          mHttpResponderID(0),          mLastCameraUpdate(0), @@ -231,7 +228,6 @@ public:  	LLEventPoll* mEventPoll;  	S32 mSeedCapMaxAttempts; -	S32 mSeedCapMaxAttemptsBeforeLogin;  	S32 mSeedCapAttempts;  	S32 mHttpResponderID; @@ -279,23 +275,17 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)          if (url.empty())          {              LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL; +            regionp->setCapabilitiesError();              return; // this error condition is not recoverable.          }          // record that we just entered a new region          newRegionEntry(*regionp); -        // After a few attempts, continue login.  But keep trying to get the caps: -        if (mSeedCapAttempts >= mSeedCapMaxAttemptsBeforeLogin && -            STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -        { -            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); -        } -          if (mSeedCapAttempts > mSeedCapMaxAttempts)          { -            // *TODO: Give a user pop-up about this error?              LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities from '" << url << "' after " << mSeedCapAttempts << " attempts.  Giving up!" << LL_ENDL; +            regionp->setCapabilitiesError();              return;  // this error condition is not recoverable.          } @@ -377,11 +367,6 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)  														 << " region name " << regionp->getName() << LL_ENDL;          regionp->setCapabilitiesReceived(true); -        if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -        { -            LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED); -        } -          break;      }       while (true); @@ -419,6 +404,11 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)          if (url.empty())          {              LL_WARNS("AppInit", "Capabilities") << "Failed to get seed capabilities, and can not determine url!" << LL_ENDL; +            if (regionp->getCapability("Seed").empty()) +            { +                // initial attempt failed to get this cap as well +                regionp->setCapabilitiesError(); +            }              break; // this error condition is not recoverable.          } @@ -598,7 +588,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mCacheLoaded(FALSE),  	mCacheDirty(FALSE),  	mReleaseNotesRequested(FALSE), -	mCapabilitiesReceived(false), +	mCapabilitiesState(CAPABILITIES_STATE_INIT),  	mSimulatorFeaturesReceived(false),  	mBitsReceived(0.f),  	mPacketsReceived(0.f), @@ -3195,12 +3185,17 @@ bool LLViewerRegion::isCapabilityAvailable(const std::string& name) const  bool LLViewerRegion::capabilitiesReceived() const  { -	return mCapabilitiesReceived; +	return mCapabilitiesState == CAPABILITIES_STATE_RECEIVED; +} + +bool LLViewerRegion::capabilitiesError() const +{ +    return mCapabilitiesState == CAPABILITIES_STATE_ERROR;  }  void LLViewerRegion::setCapabilitiesReceived(bool received)  { -	mCapabilitiesReceived = received; +	mCapabilitiesState = received ? CAPABILITIES_STATE_RECEIVED : CAPABILITIES_STATE_INIT;  	// Tell interested parties that we've received capabilities,  	// so that they can safely use getCapability(). @@ -3215,6 +3210,11 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)  	}  } +void LLViewerRegion::setCapabilitiesError() +{ +    mCapabilitiesState = CAPABILITIES_STATE_ERROR; +} +  boost::signals2::connection LLViewerRegion::setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb)  {  	return mCapabilitiesReceivedSignal.connect(cb); diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index fcbf56c81f..5ea4caa685 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -268,7 +268,9 @@ public:  	// has region received its final (not seed) capability list?  	bool capabilitiesReceived() const; +    bool capabilitiesError() const;  	void setCapabilitiesReceived(bool received); +	void setCapabilitiesError();  	boost::signals2::connection setCapabilitiesReceivedCallback(const caps_received_signal_t::slot_type& cb);  	static bool isSpecialCapabilityName(const std::string &name); @@ -527,12 +529,20 @@ private:  	BOOL									mCacheLoaded;  	BOOL                                    mCacheDirty;  	BOOL	mAlive;					// can become false if circuit disconnects -	BOOL	mCapabilitiesReceived;  	BOOL	mSimulatorFeaturesReceived;  	BOOL    mReleaseNotesRequested;  	BOOL    mDead;  //if true, this region is in the process of deleting.  	BOOL    mPaused; //pause processing the objects in the region +    typedef enum +    { +        CAPABILITIES_STATE_INIT = 0, +        CAPABILITIES_STATE_ERROR, +        CAPABILITIES_STATE_RECEIVED +    } eCababilitiesState; + +    eCababilitiesState	mCapabilitiesState; +  	typedef std::map<U32, std::vector<U32> > orphan_list_t;  	orphan_list_t mOrphanMap; | 
