diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index ef2a1d7d4..d517bc7c6 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -3810,6 +3810,7 @@ void MySQL_HostGroups_Manager::update_galera_set_writer(char *_hostname, int _po bool found_reader=false; int read_HG=-1; bool need_converge=false; + int max_writers = 0; if (resultset) { // let's get info about this cluster pthread_mutex_lock(&Galera_Info_mutex); @@ -3822,6 +3823,7 @@ void MySQL_HostGroups_Manager::update_galera_set_writer(char *_hostname, int _po read_HG=info->reader_hostgroup; need_converge=info->need_converge; info->need_converge=false; + max_writers = info->max_writers; } pthread_mutex_unlock(&Galera_Info_mutex); @@ -3839,6 +3841,26 @@ void MySQL_HostGroups_Manager::update_galera_set_writer(char *_hostname, int _po } } } + + if (need_converge == false) { + SQLite3_result *resultset2=NULL; + q = (char *)"SELECT COUNT(*) FROM mysql_servers WHERE hostgroup_id=%d AND status=0"; + mydb->execute_statement(query, &error, &cols , &affected_rows , &resultset2); + if (resultset2) { + if (resultset2->rows_count) { + for (std::vector::iterator it = resultset2->rows.begin() ; it != resultset2->rows.end(); ++it) { + SQLite3_row *r=*it; + int nwriters = atoi(r->fields[0]); + if (nwriters > max_writers) { + proxy_warning("Galera: too many writers in HG %d. Max=%d, current=%d\n", _writer_hostgroup, max_writers, nwriters); + need_converge = true; + } + } + } + delete resultset2; + } + } + if (need_converge==false) { if (found_writer) { // maybe no-op if (writer_is_also_reader==found_reader) { // either both true or both false