From b908d7f12fb4d5e4eb6b8e8b2c08a4b2dc497b4a Mon Sep 17 00:00:00 2001 From: timur <12267899-timur.5@users.noreply.gitlab.com> Date: Wed, 16 Nov 2022 07:32:17 -0400 Subject: [PATCH] SON connection pool. --- .../sidechain_net_handler.hpp | 1 + .../sidechain_net_handler_bitcoin.hpp | 1 + .../sidechain_net_handler_ethereum.hpp | 1 + .../sidechain_net_handler_hive.hpp | 2 +- .../sidechain_net_handler_peerplays.hpp | 1 + .../peerplays_sidechain_plugin.cpp | 35 +++++++++++++++++++ .../sidechain_net_handler_bitcoin.cpp | 4 +++ .../sidechain_net_handler_ethereum.cpp | 4 +++ .../sidechain_net_handler_hive.cpp | 6 +++- .../sidechain_net_handler_peerplays.cpp | 4 +++ 10 files changed, 57 insertions(+), 2 deletions(-) diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp index a9257e54..849e03c6 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler.hpp @@ -47,6 +47,7 @@ public: virtual std::string process_sidechain_transaction(const sidechain_transaction_object &sto) = 0; virtual std::string send_sidechain_transaction(const sidechain_transaction_object &sto) = 0; virtual bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount) = 0; + virtual void select_active_rpc_client() = 0; void add_to_son_listener_log(std::string trx_id); std::vector get_son_listener_log(); diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp index 62eeeab6..5d8fa488 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_bitcoin.hpp @@ -106,6 +106,7 @@ public: std::string process_sidechain_transaction(const sidechain_transaction_object &sto); std::string send_sidechain_transaction(const sidechain_transaction_object &sto); bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount); + void select_active_rpc_client(); private: std::string ip; diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_ethereum.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_ethereum.hpp index ccc1aad4..06b671ef 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_ethereum.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_ethereum.hpp @@ -47,6 +47,7 @@ public: std::string process_sidechain_transaction(const sidechain_transaction_object &sto); std::string send_sidechain_transaction(const sidechain_transaction_object &sto); bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount); + void select_active_rpc_client(); private: std::string rpc_url; diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_hive.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_hive.hpp index d99d9d13..e2ce82b7 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_hive.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_hive.hpp @@ -45,6 +45,7 @@ public: std::string process_sidechain_transaction(const sidechain_transaction_object &sto); std::string send_sidechain_transaction(const sidechain_transaction_object &sto); bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount); + void select_active_rpc_client(); private: std::vector rpc_urls; @@ -65,7 +66,6 @@ private: void hive_listener_loop(); void handle_event(const std::string &event_data); hive_rpc_client *get_active_rpc_client(); - void select_active_rpc_client(); }; }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp index 69eea1a9..68136d03 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/sidechain_net_handler_peerplays.hpp @@ -19,6 +19,7 @@ public: std::string process_sidechain_transaction(const sidechain_transaction_object &sto); std::string send_sidechain_transaction(const sidechain_transaction_object &sto); bool settle_sidechain_transaction(const sidechain_transaction_object &sto, asset &settle_amount); + void select_active_rpc_client(); private: }; diff --git a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp index 34f3e97e..9e404315 100644 --- a/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp +++ b/libraries/plugins/peerplays_sidechain/peerplays_sidechain_plugin.cpp @@ -66,6 +66,9 @@ public: void send_sidechain_transactions(sidechain_type sidechain); void settle_sidechain_transactions(sidechain_type sidechain); + void schedule_rpc_client_selection(); + void rpc_client_selection(); + private: peerplays_sidechain_plugin &plugin; @@ -94,6 +97,7 @@ private: std::set sons; std::map private_keys; fc::future _heartbeat_task; + fc::future _rpc_client_selection_task; std::map> _son_processing_task; std::map son_retry_count; uint16_t retries_threshold = 150; @@ -157,6 +161,15 @@ peerplays_sidechain_plugin_impl::~peerplays_sidechain_plugin_impl() { } catch (fc::exception &e) { edump((e.to_detail_string())); } + + try { + if (_rpc_client_selection_task.valid()) + _rpc_client_selection_task.cancel_and_wait(__FUNCTION__); + } catch (fc::canceled_exception &) { + //Expected exception. Move along. + } catch (fc::exception &e) { + edump((e.to_detail_string())); + } } void peerplays_sidechain_plugin_impl::plugin_set_program_options( @@ -323,6 +336,8 @@ void peerplays_sidechain_plugin_impl::plugin_startup() { plugin.database().applied_block.connect([&](const signed_block &b) { on_applied_block(b); }); + + schedule_rpc_client_selection(); } void peerplays_sidechain_plugin_impl::plugin_shutdown() { @@ -840,6 +855,26 @@ void peerplays_sidechain_plugin_impl::on_applied_block(const signed_block &b) { } } +void peerplays_sidechain_plugin_impl::schedule_rpc_client_selection() { + fc::time_point now = fc::time_point::now(); + static const int64_t time_to_next_rpc_selection = 5000000; + fc::time_point next_wakeup = now + fc::microseconds(time_to_next_rpc_selection); + _rpc_client_selection_task = fc::schedule([this] { + rpc_client_selection(); + }, + next_wakeup, "SON RPC client selection"); +} + +void peerplays_sidechain_plugin_impl::rpc_client_selection() { + for (const auto &active_sidechain_type : active_sidechain_types) { + if (net_handlers.at(active_sidechain_type)) { + net_handlers.at(active_sidechain_type)->select_active_rpc_client(); + } + } + schedule_rpc_client_selection(); +} + + } // namespace detail peerplays_sidechain_plugin::peerplays_sidechain_plugin() : diff --git a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp index ea4621c0..e9668b05 100644 --- a/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp +++ b/libraries/plugins/peerplays_sidechain/sidechain_net_handler_bitcoin.cpp @@ -1419,6 +1419,10 @@ void sidechain_net_handler_bitcoin::on_changed_objects_cb(const vector