From 936122bbcf30c12b7a6d10d362225f4cb9173d25 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 18 Feb 2023 02:27:08 +0300 Subject: [PATCH] Initialize msgr lazily in client to speedup vitastor-cli with RDMA enabled --- src/cli_rm_data.cpp | 1 + src/cluster_client.cpp | 34 ++++++++++++++++++++++------------ src/cluster_client.h | 4 ++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/cli_rm_data.cpp b/src/cli_rm_data.cpp index abd8bf6b..c5eb91cd 100644 --- a/src/cli_rm_data.cpp +++ b/src/cli_rm_data.cpp @@ -92,6 +92,7 @@ struct rm_inode_t void send_ops(rm_pg_t *cur_list) { + parent->cli->init_msgr(); if (parent->cli->msgr.osd_peer_fds.find(cur_list->rm_osd_num) == parent->cli->msgr.osd_peer_fds.end()) { diff --git a/src/cluster_client.cpp b/src/cluster_client.cpp index 11b68e3c..a640d99c 100644 --- a/src/cluster_client.cpp +++ b/src/cluster_client.cpp @@ -59,7 +59,6 @@ cluster_client_t::cluster_client_t(ring_loop_t *ringloop, timerfd_manager_t *tfd delete op; }; msgr.parse_config(this->config); - msgr.init(); st_cli.tfd = tfd; st_cli.on_load_config_hook = [this](json11::Json::object & cfg) { on_load_config_hook(cfg); }; @@ -73,17 +72,6 @@ cluster_client_t::cluster_client_t(ring_loop_t *ringloop, timerfd_manager_t *tfd scrap_buffer_size = SCRAP_BUFFER_SIZE; scrap_buffer = malloc_or_die(scrap_buffer_size); - - if (ringloop) - { - consumer.loop = [this]() - { - msgr.read_requests(); - msgr.send_replies(); - this->ringloop->submit(); - }; - ringloop->register_consumer(&consumer); - } } cluster_client_t::~cluster_client_t() @@ -115,6 +103,24 @@ cluster_op_t::~cluster_op_t() } } +void cluster_client_t::init_msgr() +{ + if (msgr_initialized) + return; + msgr.init(); + msgr_initialized = true; + if (ringloop) + { + consumer.loop = [this]() + { + msgr.read_requests(); + msgr.send_replies(); + this->ringloop->submit(); + }; + ringloop->register_consumer(&consumer); + } +} + void cluster_client_t::calc_wait(cluster_op_t *op) { op->prev_wait = 0; @@ -921,6 +927,10 @@ bool cluster_client_t::affects_osd(uint64_t inode, uint64_t offset, uint64_t len bool cluster_client_t::try_send(cluster_op_t *op, int i) { + if (!msgr_initialized) + { + init_msgr(); + } auto part = &op->parts[i]; auto & pool_cfg = st_cli.pool_config.at(INODE_POOL(op->cur_inode)); auto pg_it = pool_cfg.pg_config.find(part->pg_num); diff --git a/src/cluster_client.h b/src/cluster_client.h index fd2ff865..e05326a3 100644 --- a/src/cluster_client.h +++ b/src/cluster_client.h @@ -104,10 +104,14 @@ class cluster_client_t std::vector> on_ready_hooks; std::vector lists; int continuing_ops = 0; + bool msgr_initialized = false; public: etcd_state_client_t st_cli; + osd_messenger_t msgr; + void init_msgr(); + json11::Json config; json11::Json::object merged_config;