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:
parent
f9025cebb9
commit
484d298afb
|
@ -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)
|
||||
|
|
|
@ -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 &);
|
||||
|
|
Loading…
Reference in a new issue