diff --git a/include/ircd/server/peer.h b/include/ircd/server/peer.h index 3ede9e0c3..19d674d55 100644 --- a/include/ircd/server/peer.h +++ b/include/ircd/server/peer.h @@ -16,14 +16,14 @@ struct ircd::server::peer :std::enable_shared_from_this { + struct err; + static conf::item link_min_default; static conf::item link_max_default; net::remote remote; std::list links; - std::exception_ptr eptr; - string_view emsg; // points to eptr->what() - steady_point etime; // time of error + std::unique_ptr e; std::string server_name; bool ready {true}; @@ -82,6 +82,7 @@ struct ircd::server::peer // Error related bool err_has() const; string_view err_msg() const; + template void err_set(A&&...); void err_clear(); // control panel @@ -91,3 +92,16 @@ struct ircd::server::peer peer(); ~peer() noexcept; }; + +struct ircd::server::peer::err +{ + std::exception_ptr eptr; + steady_point etime + { + now() + }; + + err(std::exception_ptr eptr) + :eptr{std::move(eptr)} + {} +}; diff --git a/ircd/server.cc b/ircd/server.cc index 713be4104..b72c7fe94 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -339,23 +339,28 @@ ircd::server::peer::interrupt() void ircd::server::peer::err_clear() { - eptr = std::exception_ptr{}; - emsg = string_view{}; - etime = steady_point{}; + e.reset(nullptr); +} + +template +void +ircd::server::peer::err_set(A&&... args) +{ + this->e = std::make_unique(std::forward(args)...); } ircd::string_view ircd::server::peer::err_msg() const { - return err_has()? emsg : string_view{}; + return bool(e)? what(e->eptr) : string_view{}; } bool ircd::server::peer::err_has() const { - return bool(eptr); + return bool(e); } void @@ -491,8 +496,8 @@ ircd::server::peer::link_get(const request &request) ircd::server::link & ircd::server::peer::link_add(const size_t &num) { - if(eptr) - std::rethrow_exception(eptr); + if(e) + std::rethrow_exception(e->eptr); links.emplace_back(*this); auto &link{links.back()}; @@ -509,7 +514,7 @@ ircd::server::peer::handle_open(link &link, try { if(eptr && links.size() == 1) - this->eptr = eptr; + err_set(eptr); if(eptr) std::rethrow_exception(eptr); @@ -761,8 +766,8 @@ try if(eptr) { - this->eptr = eptr; - std::rethrow_exception(this->eptr); + err_set(eptr); + std::rethrow_exception(eptr); } static_cast(this->remote) = ipport; @@ -776,13 +781,11 @@ catch(const std::bad_weak_ptr &) catch(const std::exception &e) { assert(!wp.expired()); - this->emsg = e.what(); - this->etime = now(); - close(); - log.error("peer(%p): during name resolution: %s", this, e.what()); + + close(); } size_t