diff options
author | Roxie Linden <roxie@lindenlab.com> | 2024-03-13 13:15:50 -0700 |
---|---|---|
committer | Roxie Linden <roxie@lindenlab.com> | 2024-03-13 13:15:50 -0700 |
commit | ef8a3833eb481d2174a13c12fa13044a65d8be5f (patch) | |
tree | ec9bee296b354b2daa0a879eb458d94049b78b4e | |
parent | e5a7c9cc4e4f80d94d939009aa3aee7b50e0b12c (diff) |
Add increasing random timeout to retries.
-rw-r--r-- | indra/newview/llvoicewebrtc.cpp | 29 | ||||
-rw-r--r-- | indra/newview/llvoicewebrtc.h | 6 |
2 files changed, 31 insertions, 4 deletions
diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 2bb16cb336..d3ea02633f 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -92,6 +92,7 @@ namespace { // Don't send positional updates more frequently than this: const F32 UPDATE_THROTTLE_SECONDS = 0.1f; + const F32 MAX_RETRY_WAIT_SECONDS = 10.0f; // Cosine of a "trivially" small angle const F32 FOUR_DEGREES = 4.0f * (F_PI / 180.0f); @@ -1988,8 +1989,13 @@ LLVoiceWebRTCConnection::LLVoiceWebRTCConnection(const LLUUID ®ionID, const s mMicGain(0.0), mOutstandingRequests(0), mChannelID(channelID), - mRegionID(regionID) + mRegionID(regionID), + mRetryWaitPeriod(0) { + // retries wait a short period...randomize it so + // all clients don't try to reconnect at once. + mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5; + mWebRTCPeerConnectionInterface = llwebrtc::newPeerConnection(); mWebRTCPeerConnectionInterface->setSignalingObserver(this); } @@ -2567,6 +2573,9 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() case VOICE_STATE_SESSION_UP: { + mRetryWaitPeriod = 0; + mRetryWaitSecs = ((F32) rand() / (RAND_MAX)) + 0.5; + // we'll stay here as long as the session remains up. if (mShutDown) { @@ -2576,9 +2585,21 @@ bool LLVoiceWebRTCConnection::connectionStateMachine() } case VOICE_STATE_SESSION_RETRY: - // something went wrong, so notify that the connection has failed. - LLWebRTCVoiceClient::getInstance()->OnConnectionFailure(mChannelID, mRegionID); - setVoiceConnectionState(VOICE_STATE_DISCONNECT); + // only retry ever 'n' seconds + if (mRetryWaitPeriod++ * UPDATE_THROTTLE_SECONDS > mRetryWaitSecs) + { + // something went wrong, so notify that the connection has failed. + LLWebRTCVoiceClient::getInstance()->OnConnectionFailure(mChannelID, mRegionID); + setVoiceConnectionState(VOICE_STATE_DISCONNECT); + mRetryWaitPeriod = 0; + if (mRetryWaitSecs < MAX_RETRY_WAIT_SECONDS) + { + // back off the retry period, and do it by a small random + // bit so all clients don't reconnect at once. + mRetryWaitSecs += ((F32) rand() / (RAND_MAX)) + 0.5; + mRetryWaitPeriod = 0; + } + } break; case VOICE_STATE_DISCONNECT: diff --git a/indra/newview/llvoicewebrtc.h b/indra/newview/llvoicewebrtc.h index 03bbe00162..b26bea27ce 100644 --- a/indra/newview/llvoicewebrtc.h +++ b/indra/newview/llvoicewebrtc.h @@ -694,6 +694,12 @@ class LLVoiceWebRTCConnection : bool mShutDown; S32 mOutstandingRequests; + S32 mRetryWaitPeriod; // number of UPDATE_THROTTLE_SECONDS we've + // waited since our last attempt to connect. + F32 mRetryWaitSecs; // number of seconds to wait before next retry + + + std::vector<llwebrtc::LLWebRTCIceCandidate> mIceCandidates; bool mIceCompleted; bool mTrickling; |