0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-07 12:38:56 +02:00

ircd:Ⓜ️:fetch: Skip result check and any retry if requestor went away.

This commit is contained in:
Jason Volk 2022-07-04 17:47:47 -07:00
parent 6917ec8561
commit 934d76e81d

View file

@ -345,20 +345,20 @@ try
for(auto it(begin(requests)); it != end(requests); ++it) for(auto it(begin(requests)); it != end(requests); ++it)
{ {
auto &request(mutable_cast(*it)); auto &request(mutable_cast(*it));
if(!!request.finished) if(!!request.finished || !request.promise)
continue; continue;
else if(!request.started) else if(!request.started)
start(request); start(request);
else if(!request.finished && timedout(request, now)) else if(timedout(request, now))
retry(request); retry(request);
} }
auto it(begin(requests)); while(it != end(requests)) auto it(begin(requests)); while(it != end(requests))
{ {
auto &request(mutable_cast(*it)); auto &request(mutable_cast(*it));
if(!!request.finished) if(!!request.finished || !request.promise)
{ {
it = requests.erase(it); it = requests.erase(it);
++ret; ++ret;
@ -387,6 +387,7 @@ bool
ircd::m::fetch::start(request &request) ircd::m::fetch::start(request &request)
try try
{ {
assert(request.promise);
assert(!request.finished); assert(!request.finished);
// Attempt the user's hint first // Attempt the user's hint first
@ -442,13 +443,20 @@ ircd::m::fetch::start(request &request,
const string_view &remote) const string_view &remote)
try try
{ {
assert(!request.finished);
if(unlikely(run::level != run::level::RUN)) if(unlikely(run::level != run::level::RUN))
throw m::UNAVAILABLE throw m::UNAVAILABLE
{ {
"Cannot start fetch requests in runlevel." "Cannot start fetch requests in runlevel."
}; };
if(unlikely(!request.promise))
throw ctx::broken_promise
{
"Fetch response check interrupted."
};
assert(request.promise);
assert(!request.finished);
request.last = ircd::now<system_point>(); request.last = ircd::now<system_point>();
if(!request.started) if(!request.started)
request.started = request.last; request.started = request.last;
@ -659,7 +667,7 @@ ircd::m::fetch::handle(request &request)
if(likely(request.future)) if(likely(request.future))
handle_result(request); handle_result(request);
if(!request.eptr) if(!request.eptr || !request.promise)
finish(request); finish(request);
else else
retry(request); retry(request);
@ -671,18 +679,25 @@ void
ircd::m::fetch::handle_result(request &request) ircd::m::fetch::handle_result(request &request)
try try
{ {
assert(request.future);
const auto code const auto code
{ {
request.future->get() request.future->get()
}; };
const string_view &content const string_view content
{ {
request.future->in.content request.future->in.content
}; };
check_response(request, content); check_response(request, content);
if(unlikely(!request.promise))
throw ctx::broken_promise
{
"Fetch response check interrupted."
};
assert(request.promise);
char pbuf[48]; char pbuf[48];
log::debug log::debug
{ {
@ -715,6 +730,7 @@ void
ircd::m::fetch::retry(request &request) ircd::m::fetch::retry(request &request)
try try
{ {
assert(request.promise);
assert(!request.finished); assert(!request.finished);
assert(!!request.started && !!request.last); assert(!!request.started && !!request.last);
@ -768,6 +784,7 @@ ircd::m::fetch::finish(request &request)
res.buf = std::move(request.future->in.dynamic); res.buf = std::move(request.future->in.dynamic);
res.content = res.buf; res.content = res.buf;
strlcpy(res.origin, request.origin); strlcpy(res.origin, request.origin);
assert(request.origin == res.origin);
request.promise.set_value(std::move(res)); request.promise.set_value(std::move(res));
} }
@ -921,6 +938,12 @@ void
ircd::m::fetch::_check_event(const request &request, ircd::m::fetch::_check_event(const request &request,
const m::event &event) const m::event &event)
{ {
if(unlikely(!request.promise))
throw ctx::broken_promise
{
"Fetch response check interrupted."
};
if(request.opts.check_event_id && check_event_id && !m::check_id(event)) if(request.opts.check_event_id && check_event_id && !m::check_id(event))
{ {
event::id::buf buf; event::id::buf buf;
@ -978,6 +1001,7 @@ ircd::m::fetch::_check_event(const request &request,
} }
// only check signature for v1 events // only check signature for v1 events
assert(request.promise);
if(request.opts.check_signature && check_signature && request.opts.event_id.version() == "1") if(request.opts.check_signature && check_signature && request.opts.event_id.version() == "1")
{ {
const string_view &server const string_view &server