From 2bdf044825b0878e03ee11f296c279bf9db3fc37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 21 Feb 2020 16:43:53 +1100 Subject: [PATCH] Implementation of OFFLINE_SOFT for pxc_maint_mode --- include/MySQL_HostGroups_Manager.h | 2 +- lib/MySQL_HostGroups_Manager.cpp | 42 +++++++++++++++++------------- lib/MySQL_Monitor.cpp | 41 ++++++++++++++--------------- 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index daad49547..4b1514bc8 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -401,7 +401,7 @@ class MySQL_HostGroups_Manager { void update_group_replication_set_writer(char *_hostname, int _port, int _writer_hostgroup); void converge_group_replication_config(int _writer_hostgroup); - void update_galera_set_offline(char *_hostname, int _port, int _writer_hostgroup, char *error); + void update_galera_set_offline(char *_hostname, int _port, int _writer_hostgroup, char *error, bool soft=false); void update_galera_set_read_only(char *_hostname, int _port, int _writer_hostgroup, char *error); void update_galera_set_writer(char *_hostname, int _port, int _writer_hostgroup); void converge_galera_config(int _writer_hostgroup); diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 738c048e2..a8b17a4ae 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -4312,7 +4312,7 @@ bool Galera_Info::update(int b, int r, int o, int mw, int mtb, bool _a, int _w, return ret; } -void MySQL_HostGroups_Manager::update_galera_set_offline(char *_hostname, int _port, int _writer_hostgroup, char *_error) { +void MySQL_HostGroups_Manager::update_galera_set_offline(char *_hostname, int _port, int _writer_hostgroup, char *_error, bool soft) { bool set_offline = false; int cols=0; int affected_rows=0; @@ -4338,7 +4338,7 @@ void MySQL_HostGroups_Manager::update_galera_set_offline(char *_hostname, int _p SQLite3_result *numw_result = NULL; // we search for writers q=(char *)"SELECT 1 FROM mysql_servers WHERE hostgroup_id=%d AND status=0"; - query=(char *)malloc(strlen(q) + (sizeof(_writer_hostgroup) * 8 + 1)); + //query=(char *)malloc(strlen(q) + (sizeof(_writer_hostgroup) * 8 + 1)); sprintf(query,q,_writer_hostgroup); mydb->execute_statement(query, &error , &cols , &affected_rows , &numw_result); free(query); @@ -4354,21 +4354,27 @@ void MySQL_HostGroups_Manager::update_galera_set_offline(char *_hostname, int _p if (set_offline && info) { mydb->execute("DELETE FROM mysql_servers_incoming"); mydb->execute("INSERT INTO mysql_servers_incoming SELECT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, comment FROM mysql_servers"); - q=(char *)"UPDATE OR IGNORE mysql_servers_incoming SET hostgroup_id=%d WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; - query=(char *)malloc(strlen(q)+strlen(_hostname)+128); - sprintf(query,q,info->offline_hostgroup,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); - mydb->execute(query); - //free(query); - q=(char *)"DELETE FROM mysql_servers_incoming WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; - //query=(char *)malloc(strlen(q)+strlen(_hostname)+64); - sprintf(query,q,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); - mydb->execute(query); - //free(query); - q=(char *)"UPDATE mysql_servers_incoming SET status=0 WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; - //query=(char *)malloc(strlen(q)+strlen(_hostname)+64); - sprintf(query,q,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); - mydb->execute(query); - //free(query); + if (soft==false) { // default behavior + q=(char *)"UPDATE OR IGNORE mysql_servers_incoming SET hostgroup_id=%d WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; + //query=(char *)malloc(strlen(q)+strlen(_hostname)+128); + sprintf(query,q,info->offline_hostgroup,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); + mydb->execute(query); + //free(query); + q=(char *)"DELETE FROM mysql_servers_incoming WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; + //query=(char *)malloc(strlen(q)+strlen(_hostname)+64); + sprintf(query,q,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); + mydb->execute(query); + //free(query); + q=(char *)"UPDATE mysql_servers_incoming SET status=0 WHERE hostname='%s' AND port=%d AND hostgroup_id in (%d, %d, %d)"; + //query=(char *)malloc(strlen(q)+strlen(_hostname)+64); + sprintf(query,q,_hostname,_port,_writer_hostgroup, info->backup_writer_hostgroup, info->reader_hostgroup); + mydb->execute(query); + //free(query); + } else { + q=(char *)"UPDATE mysql_servers_incoming SET status=1 WHERE hostname='%s' AND port=%d AND hostgroup_id = %d"; + sprintf(query,q,_hostname,_port,_writer_hostgroup); + mydb->execute(query); + } converge_galera_config(_writer_hostgroup); uint64_t checksum_current = 0; uint64_t checksum_incoming = 0; @@ -4382,7 +4388,7 @@ void MySQL_HostGroups_Manager::update_galera_set_offline(char *_hostname, int _p char *error=NULL; q1 = (char *)"SELECT DISTINCT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, mysql_servers.comment FROM mysql_servers JOIN mysql_galera_hostgroups ON hostgroup_id=writer_hostgroup OR hostgroup_id=backup_writer_hostgroup OR hostgroup_id=reader_hostgroup WHERE writer_hostgroup=%d ORDER BY hostgroup_id, hostname, port"; q2 = (char *)"SELECT DISTINCT hostgroup_id, hostname, port, gtid_port, weight, status, compression, max_connections, max_replication_lag, use_ssl, max_latency_ms, mysql_servers_incoming.comment FROM mysql_servers_incoming JOIN mysql_galera_hostgroups ON hostgroup_id=writer_hostgroup OR hostgroup_id=backup_writer_hostgroup OR hostgroup_id=reader_hostgroup WHERE writer_hostgroup=%d ORDER BY hostgroup_id, hostname, port"; - query = (char *)malloc(strlen(q2)+128); + //query = (char *)malloc(strlen(q2)+128); sprintf(query,q1,_writer_hostgroup); mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset_servers); if (error == NULL) { diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 59eb04985..c13d98086 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -1811,30 +1811,29 @@ __end_process_galera_result: } } else { if (fields) { // if we didn't get any error, but fileds is NULL, we are likely hitting bug #1994 - if (pxc_maint_mode) { - MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"pxc_maint_mode=YES"); - } - else { - if (primary_partition == false || wsrep_desync == true || wsrep_local_state!=4) { - if (primary_partition == false) { - MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"primary_partition=NO"); + if (primary_partition == false || wsrep_desync == true || wsrep_local_state!=4) { + if (primary_partition == false) { + MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"primary_partition=NO"); + } else { + if (wsrep_desync == true) { + MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_desync=YES"); } else { - if (wsrep_desync == true) { - MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_desync=YES"); - } else { - char msg[80]; - sprintf(msg,"wsrep_local_state=%d",wsrep_local_state); - MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, msg); - } + char msg[80]; + sprintf(msg,"wsrep_local_state=%d",wsrep_local_state); + MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, msg); } + } + } else { + //if (wsrep_sst_donor_rejects_queries || wsrep_reject_queries) { + if (wsrep_reject_queries) { + MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_reject_queries=true"); + // } else { + // // wsrep_sst_donor_rejects_queries + // MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_sst_donor_rejects_queries=true"); + // } } else { - //if (wsrep_sst_donor_rejects_queries || wsrep_reject_queries) { - if (wsrep_reject_queries) { - MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_reject_queries=true"); - // } else { - // // wsrep_sst_donor_rejects_queries - // MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"wsrep_sst_donor_rejects_queries=true"); - // } + if (pxc_maint_mode) { + MyHGM->update_galera_set_offline(mmsd->hostname, mmsd->port, mmsd->writer_hostgroup, (char *)"pxc_maint_mode=YES", true); } else { if (read_only==true) { if (wsrep_local_recv_queue > mmsd->max_transactions_behind) {