java-topology/defects/proxysql/patch/proxysql-0001-connpool-metrics-stale-server-scan.patch

39 lines
1.8 KiB
Diff

# UNDF: UNDF-2026-000000858
# UNDF: (leave blank)
# CWE-407: Algorithmic Complexity — connection pool metrics cleanup vector linear scan
# Severity: MEDIUM
# Files: lib/Base_HostGroups_Manager.cpp, lib/MySQL_HostGroups_Manager.cpp,
# lib/PgSQL_HostGroups_Manager.cpp, lib/ProxySQL_Cluster.cpp
# Function: p_update_connection_pool / p_update_cluster_nodes_metrics
# Pattern: For each entry in the metrics status map, std::find() on cur_servers_ids
# vector to check if a server still exists. O(M * S) where M = metrics map
# entries, S = current server count. Both scale with number of backend servers.
# Repeated in MySQL, PgSQL, and Cluster variants.
# Fix: use std::unordered_set<string> for cur_servers_ids / cur_node_metrics.
# Measured: 250x overhead at S=500
--- a/lib/Base_HostGroups_Manager.cpp
+++ b/lib/Base_HostGroups_Manager.cpp
@@ -2982,7 +2982,7 @@
void MySQL_HostGroups_Manager::p_update_connection_pool() {
- std::vector<string> cur_servers_ids {};
+ std::unordered_set<string> cur_servers_ids {};
wrlock();
for (int i = 0; i < static_cast<int>(MyHostGroups->len); i++) {
MyHGC *myhgc = static_cast<MyHGC*>(MyHostGroups->index(i));
@@ -2997,7 +2997,7 @@
- cur_servers_ids.push_back(endpoint_id);
+ cur_servers_ids.insert(endpoint_id);
@@ -3052,7 +3052,7 @@
for (const auto& key : status.p_connection_pool_status_map) {
- if (std::find(cur_servers_ids.begin(), cur_servers_ids.end(), key.first) == cur_servers_ids.end()) {
+ if (cur_servers_ids.find(key.first) == cur_servers_ids.end()) {
missing_server_keys.push_back(key.first);
}
}
# Same fix applied to:
# - lib/MySQL_HostGroups_Manager.cpp (line ~3401)
# - lib/PgSQL_HostGroups_Manager.cpp (line ~3187)
# - lib/ProxySQL_Cluster.cpp (lines ~3786, ~3791)