]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #4862: mp_dbus: make MPDataBusModule stats thread safe
authorOleksandr Stepanov -X (ostepano - SOFTSERVE INC at Cisco) <ostepano@cisco.com>
Fri, 22 Aug 2025 15:00:51 +0000 (15:00 +0000)
committerChris Sherwin (chsherwi) <chsherwi@cisco.com>
Fri, 22 Aug 2025 15:00:51 +0000 (15:00 +0000)
Merge in SNORT/snort3 from ~OSTEPANO/snort3:mp_pubsub_global_stats to master

Squashed commit of the following:

commit 79442cdcc3c66b180d404771122f541d2e613542
Author: Oleksandr Stepanov <ostepano@cisco.com>
Date:   Thu Aug 14 08:15:46 2025 -0400

    mp_dbus: make MPDataBusModule stats thread safe

src/framework/mp_data_bus.cc
src/framework/mp_data_bus.h
src/main/modules.cc
src/mp_transport/mp_unix_transport/mp_unix_transport.cc
src/mp_transport/mp_unix_transport/mp_unix_transport.h
src/mp_transport/mp_unix_transport/mp_unix_transport_module.cc
src/mp_transport/mp_unix_transport/mp_unix_transport_module.h
src/mp_transport/mp_unix_transport/test/unix_transport_module_test.cc

index ed907dd0f8c58bd4ff9f274bd0e9a8d958f6dccf..68338701e336c9ab947377a6e3bf27a8ca9ef307 100644 (file)
@@ -355,6 +355,15 @@ void snort::MPDataBus::set_debug_enabled(bool flag)
     }
 }
 
+MPDataBusStats MPDataBus::get_stats_copy()
+{
+    sum_stats();
+    {
+        std::lock_guard<std::mutex> lock(mp_stats_mutex);
+        return mp_global_stats;
+    }
+}
+
 void MPDataBus::sum_stats()
 {
     std::lock_guard<std::mutex> 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)
                 {
index d72a0101fd25b2a2f8d5976d1cc99dcc135f5a6d..50d3a3b909b2037a6320828f6e45f848406331e2 100644 (file)
@@ -172,6 +172,8 @@ public:
 
     void set_debug_enabled(bool flag);
 
+    MPDataBusStats get_stats_copy();
+
     void sum_stats();
     void reset_stats();
 
index ed9da58e11e756f009615c5dc056842b8f3aaa4b..18c9e01738275be2b9d2091b0d592187e878faaf 100644 (file)
@@ -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<PegCount*>(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
 //-------------------------------------------------------------------------
index 23390435720e7a422320055f90badc3dbdb4ace8..1c2ff2c91dd84f73851fc191fe1d8474ae87b058 100644 (file)
@@ -500,6 +500,12 @@ bool MPUnixDomainTransport::is_logging_enabled()
     return this->is_logging_enabled_flag;
 }
 
+MPUnixTransportStats MPUnixDomainTransport::get_stats_copy()
+{
+    std::shared_lock<std::shared_mutex> _guard(_connection_update_mutex);
+    return this->transport_stats;
+}
+
 void MPUnixDomainTransport::sum_stats()
 {
     std::lock_guard<std::shared_mutex> _guard(_connection_update_mutex);
index 199fbf9fee7d9e5551efbdf10c8af001f4320e13..108665e050443dde5e51dc7dcedb2f15d02ba3a0 100644 (file)
@@ -151,6 +151,7 @@ class MPUnixDomainTransport : public MPTransport
     MPUnixDomainTransportConfig* get_config()
     { return config; }
 
+    MPUnixTransportStats get_stats_copy();
 
     void sum_stats();
     void reset_stats();
index 454830dae81d776ddbe98054ccbe7931b00befbd..56674242a0b3d1e5a15d4dc7037bb98e9d844d38 100644 (file)
@@ -116,18 +116,30 @@ const PegInfo *MPUnixDomainTransportModule::get_pegs() const
 }
 
 PegCount *MPUnixDomainTransportModule::get_counts() const
+{   
+    return const_cast<PegCount*>(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();
index 0c98ff7a34d5c54f4182aa3cd1c4248bc2a157d1..c7ce27d96b2986364c5aba5fa542b0800442e7a6 100644 (file)
@@ -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; }
index d069929eb062b88dcfff514af0d8e8f444043cc5..785280a703116496970fc504646dd580823c59f1 100644 (file)
@@ -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;