Retry when server responds 503 too.
That's "Service Unavailable", it's probably a temporary failure.
This commit is contained in:
parent
7d1011405a
commit
dc0ba2984e
2 changed files with 17 additions and 8 deletions
|
@ -36,7 +36,7 @@ std::size_t append_to_char_arary (std::string_view in, char* out, std::size_t of
|
||||||
|
|
||||||
ServerError::ServerError (const nap::HttpResponse& resp) :
|
ServerError::ServerError (const nap::HttpResponse& resp) :
|
||||||
std::runtime_error(
|
std::runtime_error(
|
||||||
std::string("Server replied: ") + std::to_string(resp.code) + " (" +
|
std::string("Server replied: ") + std::to_string(resp.code) + " (HTTP " +
|
||||||
std::string(resp.http_ver) + ", \"" + std::string(resp.code_desc) +
|
std::string(resp.http_ver) + ", \"" + std::string(resp.code_desc) +
|
||||||
"\")"
|
"\")"
|
||||||
),
|
),
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
# include "lzma.hpp"
|
# include "lzma.hpp"
|
||||||
#endif
|
#endif
|
||||||
#include "base64.hpp"
|
#include "base64.hpp"
|
||||||
|
#include "magic_enum.hpp"
|
||||||
#if defined(OROTOOL_WITH_RESTCCPP)
|
#if defined(OROTOOL_WITH_RESTCCPP)
|
||||||
# include <restc-cpp/error.h>
|
# include <restc-cpp/error.h>
|
||||||
#elif defined(OROTOOL_WITH_NAP)
|
#elif defined(OROTOOL_WITH_NAP)
|
||||||
|
@ -70,7 +71,7 @@ inline TimerOroApi<Op>::TimerOroApi (
|
||||||
|
|
||||||
template<oro::DBOperation Op>
|
template<oro::DBOperation Op>
|
||||||
inline void TimerOroApi<Op>::fetch_data (oro::SourceFormat store_mode) {
|
inline void TimerOroApi<Op>::fetch_data (oro::SourceFormat store_mode) {
|
||||||
int status_code = 200;
|
bool schedule_retry = false;
|
||||||
try {
|
try {
|
||||||
auto results = invoke_api_func<Op>(oro_api(), store_mode);
|
auto results = invoke_api_func<Op>(oro_api(), store_mode);
|
||||||
set_next_timer(results.header);
|
set_next_timer(results.header);
|
||||||
|
@ -96,8 +97,9 @@ inline void TimerOroApi<Op>::fetch_data (oro::SourceFormat store_mode) {
|
||||||
}
|
}
|
||||||
#if defined(OROTOOL_WITH_RESTCCPP)
|
#if defined(OROTOOL_WITH_RESTCCPP)
|
||||||
catch (const restc_cpp::RequestFailedWithErrorException& err) {
|
catch (const restc_cpp::RequestFailedWithErrorException& err) {
|
||||||
status_code = err.http_response.status_code;
|
const int status_code = err.http_response.status_code;
|
||||||
if (429 == err.http_response.status_code) {
|
if (429 == err.http_response.status_code) {
|
||||||
|
schedule_retry = true;
|
||||||
//server received too many requests, give up for now
|
//server received too many requests, give up for now
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -106,10 +108,17 @@ inline void TimerOroApi<Op>::fetch_data (oro::SourceFormat store_mode) {
|
||||||
}
|
}
|
||||||
#elif defined(OROTOOL_WITH_NAP)
|
#elif defined(OROTOOL_WITH_NAP)
|
||||||
catch (const oro::ServerError& err) {
|
catch (const oro::ServerError& err) {
|
||||||
status_code = err.error_code();
|
const int status_code = err.error_code();
|
||||||
if (429 == status_code) {
|
switch (status_code) {
|
||||||
}
|
case 503:
|
||||||
else {
|
std::cerr << "Server returned 503 during request for " <<
|
||||||
|
magic_enum::enum_name(Op) << '\n';
|
||||||
|
schedule_retry = true;
|
||||||
|
break;
|
||||||
|
case 429:
|
||||||
|
schedule_retry = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,7 +143,7 @@ inline void TimerOroApi<Op>::fetch_data (oro::SourceFormat store_mode) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_retries_left = error_retries();
|
m_retries_left = error_retries();
|
||||||
if (429 == status_code) {
|
if (schedule_retry) {
|
||||||
oro::Header head;
|
oro::Header head;
|
||||||
head.date.ts = std::chrono::time_point_cast<oro::timestamp_t::duration>(std::chrono::system_clock::now());
|
head.date.ts = std::chrono::time_point_cast<oro::timestamp_t::duration>(std::chrono::system_clock::now());
|
||||||
head.rate_limit = 1;
|
head.rate_limit = 1;
|
||||||
|
|
Loading…
Reference in a new issue