From 556d7036241c4c0bac0f71f31552e3262f129d35 Mon Sep 17 00:00:00 2001 From: junchao Date: Wed, 15 Jun 2022 14:25:13 +0800 Subject: [PATCH 1/3] [swssconfig] Optimize performance of swssconfig --- swssconfig/swssconfig.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/swssconfig/swssconfig.cpp b/swssconfig/swssconfig.cpp index a41ef0ecdd..3e15be1d08 100644 --- a/swssconfig/swssconfig.cpp +++ b/swssconfig/swssconfig.cpp @@ -21,6 +21,10 @@ const int el_count = 2; const string SWSS_CONFIG_DIR = "/etc/swss/config.d/"; +DBConnector db("APPL_DB", 0, false); +RedisPipeline pipeline(&db); +unordered_map table_map; + void usage() { cout << "Usage: swssconfig [FILE...]" << endl; @@ -39,9 +43,28 @@ void dump_db_item(KeyOpFieldsValuesTuple &db_item) SWSS_LOG_DEBUG("]"); } +ProducerStateTable &get_producer_table(const std::string &table_name) +{ + auto iter = table_map.find(table_name); + if (iter != table_map.end()) + { + return iter->second; + } + + auto ret = table_map.emplace(table_name, ProducerStateTable(&pipeline, table_name, true)); + return ret.first->second; +} + +void flush_db_data() +{ + for (auto &table_item : table_map) + { + table_item.second.flush(); + } +} + bool write_db_data(vector &db_items) { - DBConnector db("APPL_DB", 0, true); for (auto &db_item : db_items) { dump_db_item(db_item); @@ -50,12 +73,13 @@ bool write_db_data(vector &db_items) size_t pos = key.find(name_delimiter); if ((string::npos == pos) || ((key.size() - 1) == pos)) { + flush_db_data(); // flush existing valid data to DB to keep logic the same as before SWSS_LOG_ERROR("Invalid formatted hash:%s\n", key.c_str()); return false; } string table_name = key.substr(0, pos); string key_name = key.substr(pos + 1); - ProducerStateTable producer(&db, table_name); + ProducerStateTable &producer = get_producer_table(table_name); if (kfvOp(db_item) == SET_COMMAND) producer.set(key_name, kfvFieldsValues(db_item), SET_COMMAND); @@ -63,10 +87,13 @@ bool write_db_data(vector &db_items) producer.del(key_name, DEL_COMMAND); else { + flush_db_data(); // flush existing valid data to DB to keep logic the same as before SWSS_LOG_ERROR("Invalid operation: %s\n", kfvOp(db_item).c_str()); return false; } } + + flush_db_data(); return true; } From ba883487f188a15528a3649942f5245eb8013d0d Mon Sep 17 00:00:00 2001 From: junchao Date: Fri, 17 Jun 2022 15:34:35 +0800 Subject: [PATCH 2/3] Fix review comment --- swssconfig/swssconfig.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/swssconfig/swssconfig.cpp b/swssconfig/swssconfig.cpp index 3e15be1d08..5ad664e699 100644 --- a/swssconfig/swssconfig.cpp +++ b/swssconfig/swssconfig.cpp @@ -45,13 +45,7 @@ void dump_db_item(KeyOpFieldsValuesTuple &db_item) ProducerStateTable &get_producer_table(const std::string &table_name) { - auto iter = table_map.find(table_name); - if (iter != table_map.end()) - { - return iter->second; - } - - auto ret = table_map.emplace(table_name, ProducerStateTable(&pipeline, table_name, true)); + auto ret = table_map.emplace(std::piecewise_construct, std::forward_as_tuple(table_name), std::forward_as_tuple(&pipeline, table_name, true)); return ret.first->second; } From 80021b595571cf27696ff498bcfb51f8bc3bf2c0 Mon Sep 17 00:00:00 2001 From: junchao Date: Sat, 18 Jun 2022 15:07:44 +0800 Subject: [PATCH 3/3] Fix review comment --- swssconfig/swssconfig.cpp | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/swssconfig/swssconfig.cpp b/swssconfig/swssconfig.cpp index 5ad664e699..e61d038381 100644 --- a/swssconfig/swssconfig.cpp +++ b/swssconfig/swssconfig.cpp @@ -21,10 +21,6 @@ const int el_count = 2; const string SWSS_CONFIG_DIR = "/etc/swss/config.d/"; -DBConnector db("APPL_DB", 0, false); -RedisPipeline pipeline(&db); -unordered_map table_map; - void usage() { cout << "Usage: swssconfig [FILE...]" << endl; @@ -43,22 +39,12 @@ void dump_db_item(KeyOpFieldsValuesTuple &db_item) SWSS_LOG_DEBUG("]"); } -ProducerStateTable &get_producer_table(const std::string &table_name) -{ - auto ret = table_map.emplace(std::piecewise_construct, std::forward_as_tuple(table_name), std::forward_as_tuple(&pipeline, table_name, true)); - return ret.first->second; -} - -void flush_db_data() -{ - for (auto &table_item : table_map) - { - table_item.second.flush(); - } -} - bool write_db_data(vector &db_items) { + DBConnector db("APPL_DB", 0, false); + RedisPipeline pipeline(&db); // dtor of RedisPipeline will automatically flush data + unordered_map table_map; + for (auto &db_item : db_items) { dump_db_item(db_item); @@ -67,27 +53,24 @@ bool write_db_data(vector &db_items) size_t pos = key.find(name_delimiter); if ((string::npos == pos) || ((key.size() - 1) == pos)) { - flush_db_data(); // flush existing valid data to DB to keep logic the same as before SWSS_LOG_ERROR("Invalid formatted hash:%s\n", key.c_str()); return false; } string table_name = key.substr(0, pos); string key_name = key.substr(pos + 1); - ProducerStateTable &producer = get_producer_table(table_name); + auto ret = table_map.emplace(std::piecewise_construct, std::forward_as_tuple(table_name), std::forward_as_tuple(&pipeline, table_name, true)); if (kfvOp(db_item) == SET_COMMAND) - producer.set(key_name, kfvFieldsValues(db_item), SET_COMMAND); + ret.first->second.set(key_name, kfvFieldsValues(db_item), SET_COMMAND); else if (kfvOp(db_item) == DEL_COMMAND) - producer.del(key_name, DEL_COMMAND); + ret.first->second.del(key_name, DEL_COMMAND); else { - flush_db_data(); // flush existing valid data to DB to keep logic the same as before SWSS_LOG_ERROR("Invalid operation: %s\n", kfvOp(db_item).c_str()); return false; } } - flush_db_data(); return true; }