0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-05-29 00:03:45 +02:00

modules/s_fetch: Add proper fetch timeout logic.

This commit is contained in:
Jason Volk 2019-04-15 11:37:13 -07:00
parent f9025cebb9
commit 484d298afb
2 changed files with 24 additions and 7 deletions

View file

@ -24,6 +24,13 @@ ircd::m::fetch::enable
{ "persist", false },
};
decltype(ircd::m::fetch::timeout)
ircd::m::fetch::timeout
{
{ "name", "ircd.m.fetch.timeout" },
{ "default", 10L },
};
decltype(ircd::m::fetch::hook)
ircd::m::fetch::hook
{
@ -645,14 +652,12 @@ ircd::m::fetch::request_handle()
ctx::when_any(requests.begin(), requests.end())
};
if(!next.wait(seconds(5), std::nothrow))
if(!next.wait(seconds(timeout), std::nothrow))
{
for(const auto &request_ : requests)
{
auto &request(const_cast<fetch::request &>(request_));
if(!request.finished)
retry(request);
}
const auto now(ircd::time());
for(const auto &request : requests)
if(timedout(request, now))
retry(const_cast<fetch::request &>(request));
return;
}
@ -985,6 +990,16 @@ ircd::m::fetch::finish(request &request)
dock.notify_all();
}
bool
ircd::m::fetch::timedout(const request &request,
const time_t &now)
{
if(!request.started || request.finished)
return false;
return request.last + seconds(timeout).count() < now;
}
bool
ircd::m::fetch::operator<(const request &a,
const request &b)

View file

@ -24,8 +24,10 @@ namespace ircd::m::fetch
extern ctx::context eval_context;
extern ctx::context request_context;
extern hookfn<vm::eval &> hook;
extern conf::item<seconds> timeout;
extern conf::item<bool> enable;
static bool timedout(const request &, const time_t &now);
static string_view select_origin(request &, const string_view &);
static string_view select_random_origin(request &);
static void finish(request &);