From de6456a30fef8e2488d969d5aa86af2a2435c06e Mon Sep 17 00:00:00 2001 From: "Oleksandr Stepanov -X (ostepano - SOFTSERVE INC at Cisco)" Date: Fri, 22 Aug 2025 15:00:51 +0000 Subject: [PATCH] Pull request #4862: mp_dbus: make MPDataBusModule stats thread safe Merge in SNORT/snort3 from ~OSTEPANO/snort3:mp_pubsub_global_stats to master Squashed commit of the following: commit 79442cdcc3c66b180d404771122f541d2e613542 Author: Oleksandr Stepanov Date: Thu Aug 14 08:15:46 2025 -0400 mp_dbus: make MPDataBusModule stats thread safe --- src/framework/mp_data_bus.cc | 10 ++++++++ src/framework/mp_data_bus.h | 2 ++ src/main/modules.cc | 24 ++++++++++++++++--- .../mp_unix_transport/mp_unix_transport.cc | 6 +++++ .../mp_unix_transport/mp_unix_transport.h | 1 + .../mp_unix_transport_module.cc | 18 +++++++++++--- .../mp_unix_transport_module.h | 2 +- .../test/unix_transport_module_test.cc | 4 ++++ 8 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/framework/mp_data_bus.cc b/src/framework/mp_data_bus.cc index ed907dd0f..68338701e 100644 --- a/src/framework/mp_data_bus.cc +++ b/src/framework/mp_data_bus.cc @@ -355,6 +355,15 @@ void snort::MPDataBus::set_debug_enabled(bool flag) } } +MPDataBusStats MPDataBus::get_stats_copy() +{ + sum_stats(); + { + std::lock_guard lock(mp_stats_mutex); + return mp_global_stats; + } +} + void MPDataBus::sum_stats() { std::lock_guard lock(mp_stats_mutex); @@ -429,6 +438,7 @@ void MPDataBus::dump_stats(ControlConn *ctrlconn, const char *module_name) auto transport_pegs = transport_module->get_pegs(); if(transport_pegs) { + transport_module->sum_stats(false); uint32_t size = 0; while(transport_pegs[size].type != CountType::END) { diff --git a/src/framework/mp_data_bus.h b/src/framework/mp_data_bus.h index d72a0101f..50d3a3b90 100644 --- a/src/framework/mp_data_bus.h +++ b/src/framework/mp_data_bus.h @@ -172,6 +172,8 @@ public: void set_debug_enabled(bool flag); + MPDataBusStats get_stats_copy(); + void sum_stats(); void reset_stats(); diff --git a/src/main/modules.cc b/src/main/modules.cc index ed9da58e1..18c9e0173 100644 --- a/src/main/modules.cc +++ b/src/main/modules.cc @@ -503,6 +503,7 @@ public: const PegInfo* get_pegs() const override; PegCount* get_counts() const override; void reset_stats() override; + void sum_stats(bool dump_stats) override; Usage get_usage() const override { return GLOBAL; } @@ -558,16 +559,33 @@ const PegInfo* MPDataBusModule::get_pegs() const PegCount* MPDataBusModule::get_counts() const { - if(SnortConfig::get_conf()->mp_dbus) - SnortConfig::get_conf()->mp_dbus->sum_stats(); - return (PegCount*)&MPDataBus::mp_global_stats; + return const_cast(counts[get_instance_id()].data()); } void MPDataBusModule::reset_stats() { if(SnortConfig::get_conf()->mp_dbus) + { SnortConfig::get_conf()->mp_dbus->reset_stats(); + } + Module::reset_stats(); } + +void MPDataBusModule::sum_stats(bool dump_stats) +{ + if (get_instance_id() != 0) + return; + + if(SnortConfig::get_conf()->mp_dbus) + { + auto stats = SnortConfig::get_conf()->mp_dbus->get_stats_copy(); + for (int i = 0; i < get_num_counts(); i++) + { + set_peg_count(i, ((PegCount*)&stats)[i], dump_stats); + } + } +} + //------------------------------------------------------------------------- // reference module //------------------------------------------------------------------------- diff --git a/src/mp_transport/mp_unix_transport/mp_unix_transport.cc b/src/mp_transport/mp_unix_transport/mp_unix_transport.cc index 233904357..1c2ff2c91 100644 --- a/src/mp_transport/mp_unix_transport/mp_unix_transport.cc +++ b/src/mp_transport/mp_unix_transport/mp_unix_transport.cc @@ -500,6 +500,12 @@ bool MPUnixDomainTransport::is_logging_enabled() return this->is_logging_enabled_flag; } +MPUnixTransportStats MPUnixDomainTransport::get_stats_copy() +{ + std::shared_lock _guard(_connection_update_mutex); + return this->transport_stats; +} + void MPUnixDomainTransport::sum_stats() { std::lock_guard _guard(_connection_update_mutex); diff --git a/src/mp_transport/mp_unix_transport/mp_unix_transport.h b/src/mp_transport/mp_unix_transport/mp_unix_transport.h index 199fbf9fe..108665e05 100644 --- a/src/mp_transport/mp_unix_transport/mp_unix_transport.h +++ b/src/mp_transport/mp_unix_transport/mp_unix_transport.h @@ -151,6 +151,7 @@ class MPUnixDomainTransport : public MPTransport MPUnixDomainTransportConfig* get_config() { return config; } + MPUnixTransportStats get_stats_copy(); void sum_stats(); void reset_stats(); diff --git a/src/mp_transport/mp_unix_transport/mp_unix_transport_module.cc b/src/mp_transport/mp_unix_transport/mp_unix_transport_module.cc index 454830dae..56674242a 100644 --- a/src/mp_transport/mp_unix_transport/mp_unix_transport_module.cc +++ b/src/mp_transport/mp_unix_transport/mp_unix_transport_module.cc @@ -116,18 +116,30 @@ const PegInfo *MPUnixDomainTransportModule::get_pegs() const } PegCount *MPUnixDomainTransportModule::get_counts() const +{ + return const_cast(counts[get_instance_id()].data()); +} + +void MPUnixDomainTransportModule::sum_stats(bool dump_stats) { + if (get_instance_id() != 0) + return; + if (transport_handle) { transport_handle->sum_stats(); + + auto stats = transport_handle->get_stats_copy(); + + for (int i = 0; i < get_num_counts(); i++) + { + set_peg_count(i, ((PegCount*)&stats)[i], dump_stats); + } } - - return (PegCount*)&unix_transport_stats; } void MPUnixDomainTransportModule::reset_stats() { - unix_transport_stats = MPUnixTransportStats(); if (transport_handle) { transport_handle->reset_stats(); diff --git a/src/mp_transport/mp_unix_transport/mp_unix_transport_module.h b/src/mp_transport/mp_unix_transport/mp_unix_transport_module.h index 0c98ff7a3..c7ce27d96 100644 --- a/src/mp_transport/mp_unix_transport/mp_unix_transport_module.h +++ b/src/mp_transport/mp_unix_transport/mp_unix_transport_module.h @@ -44,8 +44,8 @@ class MPUnixDomainTransportModule : public Module const PegInfo* get_pegs() const override; PegCount* get_counts() const override; - bool global_stats() const override { return true; } void reset_stats() override; + void sum_stats(bool dump_stats) override; Usage get_usage() const override { return GLOBAL; } diff --git a/src/mp_transport/mp_unix_transport/test/unix_transport_module_test.cc b/src/mp_transport/mp_unix_transport/test/unix_transport_module_test.cc index d069929eb..785280a70 100644 --- a/src/mp_transport/mp_unix_transport/test/unix_transport_module_test.cc +++ b/src/mp_transport/mp_unix_transport/test/unix_transport_module_test.cc @@ -71,6 +71,10 @@ namespace snort {} void MPUnixDomainTransport::disable_logging() {} + MPUnixTransportStats MPUnixDomainTransport::get_stats_copy() + { + return {}; + } MPTransportChannelStatusHandle* MPUnixDomainTransport::get_channel_status(unsigned int& size) { size = 0; -- 2.47.3