diff --git a/Server/src/RedisManager.cpp b/Server/src/RedisManager.cpp index 7035c7e..11cd6b1 100644 --- a/Server/src/RedisManager.cpp +++ b/Server/src/RedisManager.cpp @@ -8,6 +8,7 @@ */ #include "RedisManager.h" +#include /*********************************************************************//** @@ -61,7 +62,6 @@ std::string RedisManager::GetKeySeparator() { bool RedisManager::WriteBMPTable(const std::string& table, const std::vector& keys, const std::vector fieldValues) { if (enabledTables_.find(table) == enabledTables_.end()) { - LOG_INFO("RedisManager %s is disabled", table.c_str()); return false; } std::unique_ptr stateBMPTable = std::make_unique(stateDb_.get(), table); @@ -93,6 +93,47 @@ bool RedisManager::RemoveEntityFromBMPTable(const std::vector& keys return true; } +/** + * RemoveBGPPeerFromBMPTable + * + * \param [in] peer_addr Reference to peer address + */ +bool RedisManager::RemoveBGPPeerFromBMPTable(const std::string& peer_addr) { + for (const auto& enabledTable : enabledTables_) { + ResetBMPTableByPeer(enabledTable, peer_addr); + } + return true; +} + +/** + * Reset ResetBMPTableByPeer, this will flush redis + * + * \param [in] table Reference to table name BGP_NEIGHBOR_TABLE/BGP_RIB_OUT_TABLE/BGP_RIB_IN_TABLE + * \param [in] peer_addr Reference to peer address + */ +void RedisManager::ResetBMPTableByPeer(const std::string & table, const std::string& peer_addr) { + + std::unique_ptr stateBMPTable = std::make_unique(stateDb_.get(), table); + std::vector keys; + stateBMPTable->getKeys(keys); + + std::string pattern = "|" + peer_addr; + std::vector filtered_keys; + + std::copy_if(keys.begin(), keys.end(), std::back_inserter(filtered_keys), + [&pattern](const std::string& key) { + return key.size() >= pattern.size() && + key.compare(key.size() - pattern.size(), pattern.size(), pattern) == 0; + }); + + for (const auto& key : filtered_keys) { + LOG_INFO("RedisManager ResetBMPTableByPeer del key %s", key); + } + + LOG_INFO("RedisManager ResetBMPTableByPeer data size %d", filtered_keys.size()); + + stateDb_->del(filtered_keys); +} /** * ExitRedisManager diff --git a/Server/src/RedisManager.h b/Server/src/RedisManager.h index 05a437a..debc33e 100644 --- a/Server/src/RedisManager.h +++ b/Server/src/RedisManager.h @@ -94,6 +94,14 @@ class RedisManager { */ void ResetBMPTable(const std::string & table); + /** + * Reset ResetBMPTable, this will flush redis + * + * \param [in] table Reference to table name BGP_NEIGHBOR_TABLE/BGP_RIB_OUT_TABLE/BGP_RIB_IN_TABLE + * \param [in] peer_addr Reference to peer address + */ + void ResetBMPTableByPeer(const std::string & table, const std::string& peer_addr); + /** * WriteBMPTable * @@ -118,6 +126,13 @@ class RedisManager { */ bool RemoveEntityFromBMPTable(const std::vector& keys); + /** + * RemoveBGPPeerFromBMPTable + * + * \param [in] peer_addr Reference to peer address + */ + bool RemoveBGPPeerFromBMPTable(const std::string& peer_addr); + /** * Get Key separator for deletion * diff --git a/Server/src/redis/MsgBusImpl_redis.cpp b/Server/src/redis/MsgBusImpl_redis.cpp index 1e00203..2ca7090 100644 --- a/Server/src/redis/MsgBusImpl_redis.cpp +++ b/Server/src/redis/MsgBusImpl_redis.cpp @@ -85,6 +85,10 @@ void MsgBusImpl_redis::update_Peer(obj_bgp_peer &peer, obj_peer_up_event *up, ob fieldValues.emplace_back(make_pair("bgp_err_code", to_string(down->bgp_err_code))); fieldValues.emplace_back(make_pair("bgp_err_subcode", to_string(down->bgp_err_subcode))); fieldValues.emplace_back(make_pair("error_text", down->error_text)); + + // clear db entries for bgp peer + std::string bgp_peer(peer.peer_addr); + redisMgr_.RemoveBGPPeerFromBMPTable(bgp_peer); } } break;