From 37f316e940db653451a8b48c21226a906f75b2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Wed, 31 Oct 2018 17:10:34 +0100 Subject: [PATCH] Add support for writer_is_also_reader=2 This functionality is enabled for: - mysql_galera_hostgroups - mysql_group_replication_hostgroups If writer_is_also_reader=2 and there are servers in backup_writer_hostgroup, only these servers will be used in reader_hostgroup --- include/MySQL_HostGroups_Manager.h | 12 ++-- lib/MySQL_HostGroups_Manager.cpp | 110 +++++++++++++++++++++++++---- lib/ProxySQL_Admin.cpp | 48 ++++++++++++- 3 files changed, 148 insertions(+), 22 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 532f9450b..b0be597ab 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -393,15 +393,15 @@ class Group_Replication_Info { int max_transactions_behind; char *comment; bool active; - bool writer_is_also_reader; + int writer_is_also_reader; bool __active; bool need_converge; // this is set to true on LOAD MYSQL SERVERS TO RUNTIME . This ensure that checks wil take an action int current_num_writers; int current_num_backup_writers; int current_num_readers; int current_num_offline; - Group_Replication_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c); - bool update(int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c); + Group_Replication_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c); + bool update(int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c); ~Group_Replication_Info(); }; @@ -415,15 +415,15 @@ class Galera_Info { int max_transactions_behind; char *comment; bool active; - bool writer_is_also_reader; + int writer_is_also_reader; bool __active; bool need_converge; // this is set to true on LOAD MYSQL SERVERS TO RUNTIME . This ensure that checks wil take an action int current_num_writers; int current_num_backup_writers; int current_num_readers; int current_num_offline; - Galera_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c); - bool update(int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c); + Galera_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c); + bool update(int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c); ~Galera_Info(); }; diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index f8b0b3c04..5f5dd45d1 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -1747,12 +1747,12 @@ void MySQL_HostGroups_Manager::generate_mysql_group_replication_hostgroups_table if (it2!=Group_Replication_Info_Map.end()) { info=it2->second; bool changed=false; - changed=info->update(backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, (bool)writer_is_also_reader, r->fields[8]); + changed=info->update(backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, writer_is_also_reader, r->fields[8]); if (changed) { //info->need_converge=true; } } else { - info=new Group_Replication_Info(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, (bool)writer_is_also_reader, r->fields[8]); + info=new Group_Replication_Info(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, writer_is_also_reader, r->fields[8]); //info->need_converge=true; Group_Replication_Info_Map.insert(Group_Replication_Info_Map.begin(), std::pair(writer_hostgroup,info)); } @@ -1842,12 +1842,12 @@ void MySQL_HostGroups_Manager::generate_mysql_galera_hostgroups_table() { if (it2!=Galera_Info_Map.end()) { info=it2->second; bool changed=false; - changed=info->update(backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, (bool)writer_is_also_reader, r->fields[8]); + changed=info->update(backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, writer_is_also_reader, r->fields[8]); if (changed) { //info->need_converge=true; } } else { - info=new Galera_Info(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, (bool)writer_is_also_reader, r->fields[8]); + info=new Galera_Info(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup, max_writers, max_transactions_behind, (bool)active, writer_is_also_reader, r->fields[8]); //info->need_converge=true; Galera_Info_Map.insert(Galera_Info_Map.begin(), std::pair(writer_hostgroup,info)); } @@ -3095,7 +3095,7 @@ unsigned long long MySQL_HostGroups_Manager::Get_Memory_Stats() { return intsize; } -Group_Replication_Info::Group_Replication_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c) { +Group_Replication_Info::Group_Replication_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c) { comment=NULL; if (c) { comment=strdup(c); @@ -3123,7 +3123,7 @@ Group_Replication_Info::~Group_Replication_Info() { } } -bool Group_Replication_Info::update(int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c) { +bool Group_Replication_Info::update(int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c) { bool ret=false; __active=true; if (backup_writer_hostgroup!=b) { @@ -3342,7 +3342,7 @@ void MySQL_HostGroups_Manager::update_group_replication_set_writer(char *_hostna } free(query); - bool writer_is_also_reader=false; + int writer_is_also_reader=0; bool found_writer=false; bool found_reader=false; int read_HG=-1; @@ -3378,7 +3378,11 @@ void MySQL_HostGroups_Manager::update_group_replication_set_writer(char *_hostna } if (need_converge==false) { if (found_writer) { // maybe no-op - if (writer_is_also_reader==found_reader) { // either both true or both false + if ( + (writer_is_also_reader==0 && found_reader==false) + || + (writer_is_also_reader > 0 && found_reader==true) + ) { // either both true or both false delete resultset; resultset=NULL; } @@ -3542,13 +3546,51 @@ void MySQL_HostGroups_Manager::converge_group_replication_config(int _writer_hos delete resultset; resultset=NULL; } + if (info->writer_is_also_reader==2) { + q=(char *)"SELECT hostgroup_id,hostname,port FROM mysql_servers_incoming WHERE status=0 AND hostgroup_id IN (%d, %d, %d, %d) ORDER BY weight DESC, hostname DESC"; + query=(char *)malloc(strlen(q)+256); + sprintf(query, q, info->writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup, info->offline_hostgroup); + mydb->execute_statement(query, &error, &cols , &affected_rows , &resultset); + free(query); + if (resultset) { + if (resultset->rows_count) { + int num_writers=0; + int num_backup_writers=0; + for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { + SQLite3_row *r=*it; + int hostgroup=atoi(r->fields[0]); + if (hostgroup==info->writer_hostgroup) { + num_writers++; + } else { + if (hostgroup==info->backup_writer_hostgroup) { + num_backup_writers++; + } + } + } + if (num_backup_writers) { // there are backup writers, only these will be used as readers + q=(char *)"DELETE FROM mysql_servers_incoming WHERE hostgroup_id=%d"; + query=(char *)malloc(strlen(q) + 128); + sprintf(query,q, info->reader_hostgroup); + mydb->execute(query); + free(query); + q=(char *)"INSERT OR IGNORE INTO mysql_servers_incoming (hostgroup_id,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT %d,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_incoming WHERE hostgroup_id=%d"; + query=(char *)malloc(strlen(q) + 128); + sprintf(query,q, info->reader_hostgroup, info->backup_writer_hostgroup); + mydb->execute(query); + free(query); + } + } + delete resultset; + resultset=NULL; + } + } } else { // we couldn't find the cluster, exits } pthread_mutex_unlock(&Group_Replication_Info_mutex); } -Galera_Info::Galera_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c) { +Galera_Info::Galera_Info(int w, int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c) { comment=NULL; if (c) { comment=strdup(c); @@ -3576,7 +3618,7 @@ Galera_Info::~Galera_Info() { } } -bool Galera_Info::update(int b, int r, int o, int mw, int mtb, bool _a, bool _w, char *c) { +bool Galera_Info::update(int b, int r, int o, int mw, int mtb, bool _a, int _w, char *c) { bool ret=false; __active=true; if (backup_writer_hostgroup!=b) { @@ -3853,7 +3895,7 @@ void MySQL_HostGroups_Manager::update_galera_set_writer(char *_hostname, int _po } free(query); - bool writer_is_also_reader=false; + int writer_is_also_reader=0; bool found_writer=false; bool found_reader=false; int read_HG=-1; @@ -3914,7 +3956,11 @@ void MySQL_HostGroups_Manager::update_galera_set_writer(char *_hostname, int _po if (need_converge==false) { if (found_writer) { // maybe no-op - if (writer_is_also_reader==found_reader) { // either both true or both false + if ( + (writer_is_also_reader==0 && found_reader==false) + || + (writer_is_also_reader > 0 && found_reader==true) + ) { // either both true or both false delete resultset; resultset=NULL; } @@ -4178,7 +4224,7 @@ void MySQL_HostGroups_Manager::converge_galera_config(int _writer_hostgroup) { sprintf(query,q,info->writer_hostgroup, info->writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup, info->offline_hostgroup, host.c_str(), port_n); mydb->execute(query); free(query); - bool writer_is_also_reader = info->writer_is_also_reader; + int writer_is_also_reader = info->writer_is_also_reader; if (writer_is_also_reader) { int read_HG = info->reader_hostgroup; q=(char *)"INSERT OR IGNORE INTO mysql_servers_incoming (hostgroup_id,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT %d,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_incoming WHERE hostgroup_id=%d AND hostname='%s' AND port=%d"; @@ -4205,6 +4251,44 @@ void MySQL_HostGroups_Manager::converge_galera_config(int _writer_hostgroup) { delete resultset; resultset=NULL; } + if (info->writer_is_also_reader==2) { + q=(char *)"SELECT hostgroup_id,hostname,port FROM mysql_servers_incoming WHERE status=0 AND hostgroup_id IN (%d, %d, %d, %d) ORDER BY weight DESC, hostname DESC"; + query=(char *)malloc(strlen(q)+256); + sprintf(query, q, info->writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup, info->offline_hostgroup); + mydb->execute_statement(query, &error, &cols , &affected_rows , &resultset); + free(query); + if (resultset) { + if (resultset->rows_count) { + int num_writers=0; + int num_backup_writers=0; + for (std::vector::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) { + SQLite3_row *r=*it; + int hostgroup=atoi(r->fields[0]); + if (hostgroup==info->writer_hostgroup) { + num_writers++; + } else { + if (hostgroup==info->backup_writer_hostgroup) { + num_backup_writers++; + } + } + } + if (num_backup_writers) { // there are backup writers, only these will be used as readers + q=(char *)"DELETE FROM mysql_servers_incoming WHERE hostgroup_id=%d"; + query=(char *)malloc(strlen(q) + 128); + sprintf(query,q, info->reader_hostgroup); + mydb->execute(query); + free(query); + q=(char *)"INSERT OR IGNORE INTO mysql_servers_incoming (hostgroup_id,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment) SELECT %d,hostname,port,gtid_port,status,weight,compression,max_connections,max_replication_lag,use_ssl,max_latency_ms,comment FROM mysql_servers_incoming WHERE hostgroup_id=%d"; + query=(char *)malloc(strlen(q) + 128); + sprintf(query,q, info->reader_hostgroup, info->backup_writer_hostgroup); + mydb->execute(query); + free(query); + } + } + delete resultset; + resultset=NULL; + } + } } else { // we couldn't find the cluster, exits } diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index 90c06c40e..ef6cc3e78 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -315,13 +315,21 @@ static int http_handler(void *cls, struct MHD_Connection *connection, const char #define ADMIN_SQLITE_TABLE_DEBUG_LEVELS "CREATE TABLE debug_levels (module VARCHAR NOT NULL PRIMARY KEY , verbosity INT NOT NULL DEFAULT 0)" #endif /* DEBUG */ -#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" +#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS_V1_4 "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" + +#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS_V2_0_0 "CREATE TABLE mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1,2)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" + +#define ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS_V2_0_0 #define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GROUP_REPLICATION_HOSTGROUPS "CREATE TABLE runtime_mysql_group_replication_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" -#define ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS "CREATE TABLE mysql_galera_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" +#define ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS_V2_0_0a "CREATE TABLE mysql_galera_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" + +#define ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS_V2_0_0b "CREATE TABLE mysql_galera_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1,2)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" -#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GALERA_HOSTGROUPS "CREATE TABLE runtime_mysql_galera_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" +#define ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS_V2_0_0b + +#define ADMIN_SQLITE_TABLE_RUNTIME_MYSQL_GALERA_HOSTGROUPS "CREATE TABLE runtime_mysql_galera_hostgroups (writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY , backup_writer_hostgroup INT CHECK (backup_writer_hostgroup>=0 AND backup_writer_hostgroup<>writer_hostgroup) NOT NULL , reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND backup_writer_hostgroup<>reader_hostgroup AND reader_hostgroup>0) , offline_hostgroup INT NOT NULL CHECK (offline_hostgroup<>writer_hostgroup AND offline_hostgroup<>reader_hostgroup AND backup_writer_hostgroup<>offline_hostgroup AND offline_hostgroup>=0) , active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1 , max_writers INT NOT NULL CHECK (max_writers >= 0) DEFAULT 1 , writer_is_also_reader INT CHECK (writer_is_also_reader IN (0,1,2)) NOT NULL DEFAULT 0 , max_transactions_behind INT CHECK (max_transactions_behind>=0) NOT NULL DEFAULT 0 , comment VARCHAR , UNIQUE (reader_hostgroup) , UNIQUE (offline_hostgroup) , UNIQUE (backup_writer_hostgroup))" // Cluster solution @@ -8513,6 +8521,40 @@ void ProxySQL_Admin::disk_upgrade_mysql_servers() { // copy fields from old table configdb->execute("INSERT INTO mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup,comment) SELECT writer_hostgroup , reader_hostgroup , comment FROM mysql_replication_hostgroups_v145"); } + + // upgrade mysql_group_replication_hostgroups + rci=configdb->check_table_structure((char *)"mysql_group_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS_V1_4); + if (rci) { + // upgrade is required + proxy_warning("Detected version v1.4 (pre-2.0.0) of mysql_group_replication_hostgroups\n"); + proxy_warning("ONLINE UPGRADE of table mysql_group_replication_hostgroups in progress\n"); + // drop any existing table with suffix _v14 + configdb->execute("DROP TABLE IF EXISTS mysql_group_replication_hostgroups_v14"); + // rename current table to add suffix _v14 + configdb->execute("ALTER TABLE mysql_group_replication_hostgroups RENAME TO mysql_group_replication_hostgroups_v14"); + // create new table + configdb->build_table((char *)"mysql_group_replication_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_GROUP_REPLICATION_HOSTGROUPS,false); + // copy fields from old table + configdb->execute("INSERT INTO mysql_group_replication_hostgroups SELECT * FROM mysql_group_replication_hostgroups_v14"); + } + + + // upgrade mysql_galera_hostgroups + rci=configdb->check_table_structure((char *)"mysql_galera_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS_V2_0_0a); + if (rci) { + // upgrade is required + proxy_warning("Detected version v2.0.0a (pre-2.0.0b) of mysql_galera_hostgroups\n"); + proxy_warning("ONLINE UPGRADE of table mysql_galera_hostgroups in progress\n"); + // drop any existing table with suffix _v200a + configdb->execute("DROP TABLE IF EXISTS mysql_galera_hostgroups_v200a"); + // rename current table to add suffix _v200a + configdb->execute("ALTER TABLE mysql_galera_hostgroups RENAME TO mysql_galera_hostgroups_v200a"); + // create new table + configdb->build_table((char *)"mysql_galera_hostgroups",(char *)ADMIN_SQLITE_TABLE_MYSQL_GALERA_HOSTGROUPS,false); + // copy fields from old table + configdb->execute("INSERT INTO mysql_galera_hostgroups SELECT * FROM mysql_galera_hostgroups_v200a"); + } + configdb->execute("PRAGMA foreign_keys = ON"); }