diff --git a/.gitignore b/.gitignore index 5a313b0d3..79ae68847 100644 --- a/.gitignore +++ b/.gitignore @@ -186,3 +186,5 @@ heaptrack.* *-t test/tap/tests/galera_1_timeout_count test/tap/tests/galera_2_timeout_no_count + +test/cluster/node??/* diff --git a/include/proxysql_glovars.hpp b/include/proxysql_glovars.hpp index d45f318c5..ae849d730 100644 --- a/include/proxysql_glovars.hpp +++ b/include/proxysql_glovars.hpp @@ -1,6 +1,9 @@ #ifndef __CLASS_PROXYSQL_GLOVARS_H #define __CLASS_PROXYSQL_GLOVARS_H +#define CLUSTER_SYNC_INTERFACES_ADMIN "('admin-mysql_ifaces','admin-restapi_port','admin-telnet_admin_ifaces','admin-telnet_stats_ifaces','admin-web_port')" +#define CLUSTER_SYNC_INTERFACES_MYSQL "('mysql-interfaces')" + #include #include @@ -51,6 +54,7 @@ class ProxySQL_GlobalVariables { int __cmd_proxysql_gdbg; bool __cmd_proxysql_initial; bool __cmd_proxysql_reload; + bool cluster_sync_interfaces; // If true, also mysql-interfaces and admin-mysql_ifaces are synced. false by default char *__cmd_proxysql_admin_socket; char *config_file; char *datadir; diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 65d0830d1..c02641920 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -6079,8 +6079,13 @@ void ProxySQL_Admin::flush_admin_variables___database_to_runtime(SQLite3DB *db, int cols=0; int affected_rows=0; SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'admin-\%' ORDER BY variable_name"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); + std::string q; + if (GloVars.cluster_sync_interfaces) { + q="SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'admin-\%' ORDER BY variable_name"; + } else { + q="SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'admin-\%' AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_ADMIN) + " ORDER BY variable_name"; + } + admindb->execute_statement(q.c_str(), &error , &cols , &affected_rows , &resultset); uint64_t hash1 = resultset->raw_checksum(); uint32_t d32[2]; char buf[20]; @@ -6434,8 +6439,13 @@ void ProxySQL_Admin::flush_mysql_variables___database_to_runtime(SQLite3DB *db, int cols=0; int affected_rows=0; SQLite3_result *resultset=NULL; - char *q=(char *)"SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'mysql-%' ORDER BY variable_name"; - admindb->execute_statement(q, &error , &cols , &affected_rows , &resultset); + std::string q; + if (GloVars.cluster_sync_interfaces) { + q = "SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'mysql-\%' ORDER BY variable_name"; + } else { + q = "SELECT variable_name, variable_value FROM runtime_global_variables WHERE variable_name LIKE 'mysql-\%' AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_MYSQL) + " ORDER BY variable_name"; + } + admindb->execute_statement(q.c_str(), &error , &cols , &affected_rows , &resultset); uint64_t hash1 = resultset->raw_checksum(); uint32_t d32[2]; char buf[20]; diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 76bfe08a5..f1bad58e4 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -1411,12 +1411,27 @@ void ProxySQL_Cluster::pull_global_variables_from_peer(const std::string& var_ty if (rc_conn) { std::string s_query = ""; string_format("SELECT * FROM runtime_global_variables WHERE variable_name LIKE '%s-%%'", s_query, var_type.c_str()); + if (GloVars.cluster_sync_interfaces == false) { + if (var_type == "admin") { + s_query += " AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_ADMIN); + } else if (var_type == "mysql") { + s_query += " AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_MYSQL); + } + } mysql_query(conn, s_query.c_str()); if (rc_query == 0) { MYSQL_RES *result = mysql_store_result(conn); std::string d_query = ""; - string_format("DELETE FROM runtime_global_variables WHERE variable_name LIKE '%s-%%'", d_query, var_type.c_str()); + // remember that we read from runtime_global_variables but write into global_variables + string_format("DELETE FROM global_variables WHERE variable_name LIKE '%s-%%'", d_query, var_type.c_str()); + if (GloVars.cluster_sync_interfaces == false) { + if (var_type == "admin") { + d_query += " AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_ADMIN); + } else if (var_type == "mysql") { + d_query += " AND variable_name NOT IN " + string(CLUSTER_SYNC_INTERFACES_MYSQL); + } + } GloAdmin->admindb->execute(d_query.c_str()); MYSQL_ROW row; diff --git a/lib/ProxySQL_GloVars.cpp b/lib/ProxySQL_GloVars.cpp index 091f23a6d..88dc70d6e 100644 --- a/lib/ProxySQL_GloVars.cpp +++ b/lib/ProxySQL_GloVars.cpp @@ -84,6 +84,7 @@ ProxySQL_GlobalVariables::ProxySQL_GlobalVariables() : __cmd_proxysql_initial=false; __cmd_proxysql_reload=false; + cluster_sync_interfaces=false; statuses.stack_memory_mysql_threads = 0; statuses.stack_memory_admin_threads = 0; diff --git a/src/main.cpp b/src/main.cpp index dad1450b6..309e36de2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -876,6 +876,17 @@ void ProxySQL_Main_process_global_variables(int argc, const char **argv) { } } } + // if cluster_sync_interfaces is true, interfaces variables are synced too + if (root.exists("cluster_sync_interfaces")==true) { + bool value_bool; + bool rc; + rc=root.lookupValue("cluster_sync_interfaces", value_bool); + if (rc==true) { + GloVars.cluster_sync_interfaces=value_bool; + } else { + proxy_error("The config file is configured with an invalid cluster_sync_interfaces\n"); + } + } if (root.exists("sqlite3_plugin")==true) { string sqlite3_plugin; bool rc; diff --git a/src/proxysql.cfg b/src/proxysql.cfg index e521ccd13..2f936344b 100644 --- a/src/proxysql.cfg +++ b/src/proxysql.cfg @@ -5,6 +5,7 @@ # Grammar is also copied at the end of this file uuid="9588556d-fc2d-48ac-9c48-201abab06768" +cluster_sync_interfaces=true restart_on_missing_heartbeats=10 datadir="/var/lib/proxysql" //execute_on_exit_failure="/path/to/script"