From b03caab7ff9307b387e422732dca88201d4448bc Mon Sep 17 00:00:00 2001 From: yaqiangz Date: Tue, 19 Dec 2023 02:59:13 +0000 Subject: [PATCH] [counter] Clear counter table when init --- src/relay.cpp | 20 +++++++++++++++++++- test/mock_relay.cpp | 11 +++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/relay.cpp b/src/relay.cpp index eccb62e..82735d4 100644 --- a/src/relay.cpp +++ b/src/relay.cpp @@ -322,7 +322,6 @@ void initialize_counter(std::shared_ptr state_db, std::string std::string table_name = counter_table + ifname; auto init_value = gen_counter_json_str(DHCPv6_MESSAGE_TYPE_UNKNOWN, 0); - state_db->del(table_name); state_db->hset(table_name, "RX", init_value); state_db->hset(table_name, "TX", init_value); } @@ -1484,6 +1483,23 @@ void prepare_socket_callback(event_base *base, int socket, void (*cb)(evutil_soc event_add(event, NULL); } +/** + * @code clear_counter(std::shared_ptr state_db); + * + * @brief Clear all counter + * + * @param state_db state_db connector pointer + * + */ +void clear_counter(std::shared_ptr state_db) { + std::string match_pattern = counter_table + std::string("*"); + auto keys = state_db->keys(match_pattern); + + for (auto &itr : keys) { + state_db->del(itr); + } +} + /** * @code loop_relay(std::unordered_map &vlans); * @@ -1513,6 +1529,8 @@ void loop_relay(std::unordered_map &vlans) { prepare_socket_callback(base, out_filter, outbound_callback, reinterpret_cast(state_db.get())); sockets.push_back(out_filter); + clear_counter(state_db); + int lo_sock = -1; if (dual_tor_sock) { std::string lo_string(loopback); diff --git a/test/mock_relay.cpp b/test/mock_relay.cpp index 91f50ea..9f728e6 100644 --- a/test/mock_relay.cpp +++ b/test/mock_relay.cpp @@ -325,6 +325,17 @@ TEST(counter, initialize_counter) EXPECT_TRUE(state_db->hexists("DHCPv6_COUNTER_TABLE|Vlan1000", "TX")); } +TEST(counter, clear_counter) +{ + std::shared_ptr state_db = std::make_shared ("STATE_DB", 0); + std::string ifname = "Vlan1000"; + initialize_counter(state_db, ifname); + EXPECT_TRUE(state_db->hexists("DHCPv6_COUNTER_TABLE|Vlan1000", "RX")); + EXPECT_TRUE(state_db->hexists("DHCPv6_COUNTER_TABLE|Vlan1000", "TX")); + clear_counter(state_db) + EXPECT_FALSE(state_db->exists("DHCPv6_COUNTER_TABLE|Vlan1000")); +} + TEST(counter, increase_counter) { std::shared_ptr state_db = std::make_shared ("STATE_DB", 0);