summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/newview/llhttpretrypolicy.cpp23
-rwxr-xr-xindra/newview/llhttpretrypolicy.h11
-rwxr-xr-xindra/newview/tests/llhttpretrypolicy_test.cpp33
3 files changed, 50 insertions, 17 deletions
diff --git a/indra/newview/llhttpretrypolicy.cpp b/indra/newview/llhttpretrypolicy.cpp
index 5c6dabbe99..82f6eab00e 100755
--- a/indra/newview/llhttpretrypolicy.cpp
+++ b/indra/newview/llhttpretrypolicy.cpp
@@ -28,6 +28,17 @@
#include "llhttpretrypolicy.h"
+LLAdaptiveRetryPolicy::LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries):
+ mMinDelay(min_delay),
+ mMaxDelay(max_delay),
+ mBackoffFactor(backoff_factor),
+ mMaxRetries(max_retries),
+ mDelay(min_delay),
+ mRetryCount(0),
+ mShouldRetry(true)
+{
+}
+
bool LLAdaptiveRetryPolicy::getRetryAfter(const LLSD& headers, F32& retry_header_time)
{
return (headers.has(HTTP_IN_HEADER_RETRY_AFTER)
@@ -77,6 +88,11 @@ void LLAdaptiveRetryPolicy::onFailure(const LLCore::HttpResponse *response)
void LLAdaptiveRetryPolicy::onFailureCommon(S32 status, bool has_retry_header_time, F32 retry_header_time)
{
+ if (!mShouldRetry)
+ {
+ llinfos << "keep on failing" << llendl;
+ return;
+ }
if (mRetryCount > 0)
{
mDelay = llclamp(mDelay*mBackoffFactor,mMinDelay,mMaxDelay);
@@ -111,7 +127,12 @@ void LLAdaptiveRetryPolicy::onFailureCommon(S32 status, bool has_retry_header_ti
bool LLAdaptiveRetryPolicy::shouldRetry(F32& seconds_to_wait) const
{
- llassert(mRetryCount>0); // have to call onFailure() before shouldRetry()
+ if (mRetryCount == 0)
+ {
+ // Called shouldRetry before any failure.
+ seconds_to_wait = F32_MAX;
+ return false;
+ }
seconds_to_wait = mShouldRetry ? mRetryTimer.getRemainingTimeF32() : F32_MAX;
return mShouldRetry;
}
diff --git a/indra/newview/llhttpretrypolicy.h b/indra/newview/llhttpretrypolicy.h
index ca37e5f73c..6f63f047de 100755
--- a/indra/newview/llhttpretrypolicy.h
+++ b/indra/newview/llhttpretrypolicy.h
@@ -56,16 +56,7 @@ public:
class LLAdaptiveRetryPolicy: public LLHTTPRetryPolicy
{
public:
- LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries):
- mMinDelay(min_delay),
- mMaxDelay(max_delay),
- mBackoffFactor(backoff_factor),
- mMaxRetries(max_retries),
- mDelay(min_delay),
- mRetryCount(0),
- mShouldRetry(true)
- {
- }
+ LLAdaptiveRetryPolicy(F32 min_delay, F32 max_delay, F32 backoff_factor, U32 max_retries);
// virtual
void onFailure(S32 status, const LLSD& headers);
diff --git a/indra/newview/tests/llhttpretrypolicy_test.cpp b/indra/newview/tests/llhttpretrypolicy_test.cpp
index 39bd15d62f..43fc1178cc 100755
--- a/indra/newview/tests/llhttpretrypolicy_test.cpp
+++ b/indra/newview/tests/llhttpretrypolicy_test.cpp
@@ -45,8 +45,12 @@ void RetryPolicyTestObject::test<1>()
LLSD headers;
F32 wait_seconds;
+ // No retry until we've finished a try.
+ ensure("never retry 0", !never_retry.shouldRetry(wait_seconds));
+
+ // 0 retries max.
never_retry.onFailure(500,headers);
- ensure("never retry", !never_retry.shouldRetry(wait_seconds));
+ ensure("never retry 1", !never_retry.shouldRetry(wait_seconds));
}
template<> template<>
@@ -70,6 +74,9 @@ void RetryPolicyTestObject::test<3>()
bool should_retry;
U32 frac_bits = 6;
+ // No retry until we've finished a try.
+ ensure("basic_retry 0", !basic_retry.shouldRetry(wait_seconds));
+
// Starting wait 1.0
basic_retry.onFailure(500,headers);
should_retry = basic_retry.shouldRetry(wait_seconds);
@@ -224,10 +231,13 @@ void RetryPolicyTestObject::test<7>()
time_t nowseconds;
time(&nowseconds);
sd_headers[HTTP_IN_HEADER_RETRY_AFTER] = LLDate((F64)nowseconds).asRFC1123();
- LLAdaptiveRetryPolicy policy(17.0,644.0,3.0,10);
+ LLAdaptiveRetryPolicy policy(17.0,644.0,3.0,5);
F32 seconds_to_wait;
bool should_retry;
+ // No retry until we've finished a try.
+ ensure("header 0", !policy.shouldRetry(seconds_to_wait));
+
// no retry header, use default.
policy.onFailure(500,LLSD());
should_retry = policy.shouldRetry(seconds_to_wait);
@@ -246,7 +256,7 @@ void RetryPolicyTestObject::test<7>()
LLCore::HttpHeaders *headers = new LLCore::HttpHeaders();
response->setStatus(503);
response->setHeaders(headers);
- headers->mHeaders.push_back("retry-after: 600");
+ headers->mHeaders.push_back(HTTP_IN_HEADER_RETRY_AFTER + ": 600");
policy.onFailure(response);
should_retry = policy.shouldRetry(seconds_to_wait);
ensure("header 3",should_retry);
@@ -262,13 +272,24 @@ void RetryPolicyTestObject::test<7>()
response->setHeaders(headers);
LLSD sd_headers;
time(&nowseconds);
- headers->mHeaders.push_back("retry-after: " + LLDate((F64)nowseconds).asRFC1123());
+ headers->mHeaders.push_back(HTTP_IN_HEADER_RETRY_AFTER + ": " + LLDate((F64)nowseconds).asRFC1123());
policy.onFailure(response);
should_retry = policy.shouldRetry(seconds_to_wait);
- ensure("header 3",should_retry);
- ensure_approximately_equals("header 3", seconds_to_wait, 0.0F, 6);
+ ensure("header 4",should_retry);
+ ensure_approximately_equals("header 4", seconds_to_wait, 0.0F, 6);
response->release();
}
+
+ // Timeout should be clamped at max.
+ policy.onFailure(500,LLSD());
+ should_retry = policy.shouldRetry(seconds_to_wait);
+ ensure("header 5", should_retry);
+ ensure_approximately_equals("header 5", seconds_to_wait, 644.0F, 6);
+
+ // No more retries.
+ policy.onFailure(500,LLSD());
+ should_retry = policy.shouldRetry(seconds_to_wait);
+ ensure("header 6", !should_retry);
}
}