From 6bc8a10c672c9f33ad5a24dc841d7094890454b3 Mon Sep 17 00:00:00 2001 From: timur <12267899-timur.5@users.noreply.gitlab.com> Date: Mon, 28 Nov 2022 06:38:50 -0400 Subject: [PATCH] SON conn. pool --- .../peerplays_sidechain/common/rpc_client.cpp | 25 +++++++++++++++++++ .../peerplays_sidechain/common/rpc_client.hpp | 7 +++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libraries/plugins/peerplays_sidechain/common/rpc_client.cpp b/libraries/plugins/peerplays_sidechain/common/rpc_client.cpp index df9b3e0e..910dc846 100644 --- a/libraries/plugins/peerplays_sidechain/common/rpc_client.cpp +++ b/libraries/plugins/peerplays_sidechain/common/rpc_client.cpp @@ -289,6 +289,17 @@ rpc_client::rpc_client(const std::vector &_urls, const std::vector< for (size_t i=0; i < _urls.size(); i++) connections.push_back(new rpc_connection(_urls[i], _users[i], _passwords[i], _debug_rpc_calls)); n_active_conn = 0; + schedule_connection_selection(); +} + +void rpc_client::schedule_connection_selection() +{ + fc::time_point now = fc::time_point::now(); + static const int64_t time_to_next_conn_selection = 2000000; + fc::time_point next_wakeup = now + fc::microseconds(time_to_next_conn_selection); + connection_selection_task = fc::schedule([this] { + reselect_connection(); + }, next_wakeup, "SON RPC connection selection"); } void rpc_client::reselect_connection() @@ -337,6 +348,8 @@ void rpc_client::reselect_connection() } } } + + schedule_connection_selection(); } rpc_connection &rpc_client::get_active_connection() const @@ -349,4 +362,16 @@ std::string rpc_client::send_post_request(std::string method, std::string params return get_active_connection().send_post_request(method, params, show_log); } +rpc_client::~rpc_client() +{ + try { + if (connection_selection_task.valid()) + connection_selection_task.cancel_and_wait(__FUNCTION__); + } catch (fc::canceled_exception &) { + //Expected exception. Move along. + } catch (fc::exception &e) { + edump((e.to_detail_string())); + } +} + }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/common/rpc_client.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/common/rpc_client.hpp index 67e98d91..83cb8171 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/common/rpc_client.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/common/rpc_client.hpp @@ -13,15 +13,20 @@ class rpc_connection; class rpc_client { public: rpc_client(const std::vector &_urls, const std::vector &_users, const std::vector &_passwords, bool _debug_rpc_calls); + ~rpc_client(); protected: std::string send_post_request(std::string method, std::string params, bool show_log); private: std::vector connections; - int n_active_conn; + int n_active_conn; + fc::future connection_selection_task; rpc_connection &get_active_connection() const; + + void select_connection(); + void schedule_connection_selection(); virtual uint64_t ping(rpc_connection &conn) const = 0; };