summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2013-04-11 16:17:23 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2013-04-11 16:17:23 -0400
commite17920defbf1d39ecd9e88500ba268c59bb84008 (patch)
treeb026ddc91431df37db101502c1d9185482b70978 /indra
parent14ca6a1247e68805aae22cf573a39819383fe3d4 (diff)
SH-4061 WIP - started adding retry to texture fetch, making retry policy compatible with old and new http libraries
Diffstat (limited to 'indra')
-rwxr-xr-xindra/llmessage/llhttpretrypolicy.cpp17
-rwxr-xr-xindra/llmessage/llhttpretrypolicy.h17
-rwxr-xr-xindra/newview/lltexturefetch.cpp1
-rwxr-xr-xindra/newview/lltexturefetch.h3
4 files changed, 35 insertions, 3 deletions
diff --git a/indra/llmessage/llhttpretrypolicy.cpp b/indra/llmessage/llhttpretrypolicy.cpp
index 23d9e64c13..7e4dfc7250 100755
--- a/indra/llmessage/llhttpretrypolicy.cpp
+++ b/indra/llmessage/llhttpretrypolicy.cpp
@@ -27,8 +27,21 @@
#include "linden_common.h"
#include "llhttpretrypolicy.h"
+bool LLAdaptiveRetryPolicy::getRetryAfter(const LLSD& headers, retry_header_time)
+{
+ return (headers.has(HTTP_IN_HEADER_RETRY_AFTER)
+ && getSecondsUntilRetryAfter(headers[HTTP_IN_HEADER_RETRY_AFTER].asStringRef(), retry_header_time));
+}
+
void LLAdaptiveRetryPolicy::onFailure(S32 status, const LLSD& headers)
{
+ F32 retry_header_time;
+ bool has_retry_header_time = getRetryAfter(headers,retry_header_time);
+ onFailureCommon(status, has_retry_header_time, retry_header_time);
+}
+
+void LLAdaptiveRetryPolicy::onFailureCommon(S32 status, bool has_retry_header_time, F32 retry_header_time)
+{
if (mRetryCount > 0)
{
mDelay = llclamp(mDelay*mBackoffFactor,mMinDelay,mMaxDelay);
@@ -36,9 +49,7 @@ void LLAdaptiveRetryPolicy::onFailure(S32 status, const LLSD& headers)
// Honor server Retry-After header.
// Status 503 may ask us to wait for a certain amount of time before retrying.
F32 wait_time = mDelay;
- F32 retry_header_time;
- if (headers.has(HTTP_IN_HEADER_RETRY_AFTER)
- && getSecondsUntilRetryAfter(headers[HTTP_IN_HEADER_RETRY_AFTER].asStringRef(), retry_header_time))
+ if (has_retry_header_time)
{
wait_time = retry_header_time;
}
diff --git a/indra/llmessage/llhttpretrypolicy.h b/indra/llmessage/llhttpretrypolicy.h
index f2eba0965b..cf27bb3048 100755
--- a/indra/llmessage/llhttpretrypolicy.h
+++ b/indra/llmessage/llhttpretrypolicy.h
@@ -29,8 +29,13 @@
#include "lltimer.h"
#include "llthread.h"
+
#include "llhttpconstants.h"
+// For compatibility with new core http lib.
+#include "httpresponse.h"
+#include "httpheaders.h"
+
// This is intended for use with HTTP Clients/Responders, but is not
// specifically coupled with those classes.
class LLHTTPRetryPolicy: public LLThreadSafeRefCount
@@ -40,6 +45,9 @@ public:
virtual ~LLHTTPRetryPolicy() {}
// Call once after an HTTP failure to update state.
virtual void onFailure(S32 status, const LLSD& headers) = 0;
+
+ virtual void onFailure(const HttpResponse *response, const HttpHeaders *headers) = 0;
+
virtual bool shouldRetry(F32& seconds_to_wait) const = 0;
};
@@ -59,10 +67,19 @@ public:
{
}
+ // virtual
void onFailure(S32 status, const LLSD& headers);
+ // virtual
+ void onFailure(const HttpResponse *response, const HttpHeaders *headers);
+ // virtual
bool shouldRetry(F32& seconds_to_wait) const;
+protected:
+ bool getRetryAfter(const LLSD& headers, retry_header_time)
+ void onFailureCommon(S32 status, bool has_retry_header_time, F32 retry_header_time);
+
private:
+
F32 mMinDelay; // delay never less than this value
F32 mMaxDelay; // delay never exceeds this value
F32 mBackoffFactor; // delay increases by this factor after each retry, up to mMaxDelay.
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 58cfc80839..026f36e205 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1918,6 +1918,7 @@ void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRe
<< " status: " << status.toHex()
<< " '" << status.toString() << "'"
<< llendl;
+
// unsigned int offset(0), length(0), full_length(0);
// response->getRange(&offset, &length, &full_length);
// llwarns << "HTTP COMPLETE: " << mID << " handle: " << handle
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 9f77d58727..c6bd342a7b 100755
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -396,6 +396,9 @@ private:
e_tex_source mFetchSource;
e_tex_source mOriginFetchSource;
+ // Retry logic
+ LLAdaptiveRetryPolicy mFetchRetryPolicy;
+
public:
//debug use
LLTextureFetchDebugger* getFetchDebugger() { return mFetchDebugger;}