0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-16 15:00:51 +01:00

modules/federation/federation: Improve version; move ostream to modules/console.

This commit is contained in:
Jason Volk 2018-05-05 03:22:20 -07:00
parent ad2f823056
commit 18634c122b
2 changed files with 55 additions and 14 deletions

View file

@ -3532,15 +3532,36 @@ console_cmd__feds__version(opt &out, const string_view &line)
m::room_id(param.at(0)) m::room_id(param.at(0))
}; };
using closure_prototype = bool (const string_view &,
std::exception_ptr,
const json::object &);
using prototype = void (const m::room::id &, using prototype = void (const m::room::id &,
std::ostream &); const milliseconds &,
const std::function<closure_prototype> &);
static m::import<prototype> feds__version static m::import<prototype> feds__version
{ {
"federation_federation", "feds__version" "federation_federation", "feds__version"
}; };
feds__version(room_id, out); feds__version(room_id, out.timeout, [&out]
(const string_view &origin, std::exception_ptr eptr, const json::object &response)
{
out << (eptr? '-' : '+')
<< " "
<< std::setw(40) << std::left << origin
<< " ";
if(eptr)
out << what(eptr);
else
out << string_view{response};
out << std::endl;
return true;
});
return true; return true;
} }

View file

@ -24,6 +24,8 @@ namespace ircd::m::feds
struct ircd::m::feds::version struct ircd::m::feds::version
:m::v1::version :m::v1::version
{ {
using closure = std::function<bool (const string_view &, std::exception_ptr, const json::object &)>;
char origin[256]; char origin[256];
char buf[16_KiB]; char buf[16_KiB];
@ -37,8 +39,8 @@ struct ircd::m::feds::version
}()} }()}
{} {}
version(version &&) = delete;
version(const version &) = delete; version(const version &) = delete;
version &operator=(const version &) = delete;
}; };
std::list<m::feds::version> std::list<m::feds::version>
@ -67,31 +69,49 @@ feds__version(const m::room::id &room_id)
} }
extern "C" void extern "C" void
feds__version(const m::room::id &room_id, std::ostream &out) feds__version(const m::room::id &room_id,
const milliseconds &timeout,
const m::feds::version::closure &closure)
{ {
auto reqs auto reqs
{ {
feds__version(room_id) feds__version(room_id)
}; };
auto all auto when
{ {
ctx::when_all(begin(reqs), end(reqs)) now<steady_point>() + timeout
}; };
all.wait(30s, std::nothrow); while(!reqs.empty())
for(auto &req : reqs) try
{ {
if(req.wait(1ms, std::nothrow)) auto next
{
ctx::when_any(begin(reqs), end(reqs))
};
if(!next.wait_until(when, std::nothrow))
break;
const auto it
{
next.get()
};
auto &req{*it}; try
{ {
const auto code{req.get()}; const auto code{req.get()};
const json::object &response{req}; const json::object &response{req};
out << "+ " << std::setw(40) << std::left << req.origin if(!closure(req.origin, {}, response))
<< " " << string_view{response} break;
<< std::endl;
} }
else cancel(req); catch(const std::exception &)
{
if(!closure(req.origin, std::current_exception(), {}))
break;
}
reqs.erase(it);
} }
catch(const std::exception &e) catch(const std::exception &e)
{ {