From ea3f7abde5f9a0e429e15516ddfde264934ba710 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 6 Mar 2018 04:51:20 -0800 Subject: [PATCH] ircd::server: Add state to deny any resubmission on peer close. --- include/ircd/server/peer.h | 1 + ircd/server.cc | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/ircd/server/peer.h b/include/ircd/server/peer.h index 1ea7b885c..3ede9e0c3 100644 --- a/include/ircd/server/peer.h +++ b/include/ircd/server/peer.h @@ -25,6 +25,7 @@ struct ircd::server::peer string_view emsg; // points to eptr->what() steady_point etime; // time of error std::string server_name; + bool ready {true}; template size_t accumulate_links(F&&) const; template size_t accumulate_tags(F&&) const; diff --git a/ircd/server.cc b/ircd/server.cc index 4f705cc6b..91c1441fb 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -309,9 +309,7 @@ noexcept void ircd::server::peer::close(const net::close_opts &opts) { - for(auto &link : this->links) - link.exclude = true; - + ready = false; std::vector links(this->links.size()); pointers(this->links, links); for(const auto &link : links) @@ -354,6 +352,12 @@ void ircd::server::peer::submit(request &request) try { + if(unlikely(!ready || !server::ready)) + throw unavailable + { + "Peer is unable to take any requests." + }; + link *const ret { link_get(request)