Implemented variable cluster_sync_interfaces

pull/3305/head
René Cannaò 5 years ago
parent 7cc750a111
commit 4f3c133cd0

2
.gitignore vendored

@ -186,3 +186,5 @@ heaptrack.*
*-t
test/tap/tests/galera_1_timeout_count
test/tap/tests/galera_2_timeout_no_count
test/cluster/node??/*

@ -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 <memory>
#include <prometheus/registry.h>
@ -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;

@ -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];

@ -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;

@ -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;

@ -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;

@ -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"

Loading…
Cancel
Save