diff --git a/include/MySQL_HostGroups_Manager.h b/include/MySQL_HostGroups_Manager.h index 184c10b6a..87661b7d1 100644 --- a/include/MySQL_HostGroups_Manager.h +++ b/include/MySQL_HostGroups_Manager.h @@ -16,7 +16,8 @@ enum MySerStatus { MYSQL_SERVER_STATUS_ONLINE, MYSQL_SERVER_STATUS_SHUNNED, MYSQL_SERVER_STATUS_OFFLINE_SOFT, - MYSQL_SERVER_STATUS_OFFLINE_HARD + MYSQL_SERVER_STATUS_OFFLINE_HARD, + MYSQL_SERVER_STATUS_SHUNNED_REPLICATION_LAG }; @@ -129,6 +130,8 @@ class MySQL_HostGroups_Manager { void push_MyConn_to_pool(MySQL_Connection *); void destroy_MyConn_from_pool(MySQL_Connection *); + + void replication_lag_action(int, char*, unsigned int, int); }; #endif /* __CLASS_MYSQL_HOSTGROUPS_MANAGER_H */ diff --git a/lib/MySQL_HostGroups_Manager.cpp b/lib/MySQL_HostGroups_Manager.cpp index 00350e207..526e9bab3 100644 --- a/lib/MySQL_HostGroups_Manager.cpp +++ b/lib/MySQL_HostGroups_Manager.cpp @@ -382,9 +382,6 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table() { case 0: st=(char *)"ONLINE"; break; - case 1: - st=(char *)"SHUNNED"; - break; case 2: st=(char *)"OFFLINE_SOFT"; break; @@ -392,7 +389,8 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table() { st=(char *)"OFFLINE_HARD"; break; default: - assert(0); + case 1: + st=(char *)"SHUNNED"; break; } fprintf(stderr,"HID: %d , address: %s , port: %d , weight: %d , status: %s , max_connections: %u , max_replication_lag: %u\n", mysrvc->myhgc->hid, mysrvc->address, mysrvc->port, mysrvc->weight, st, mysrvc->max_connections, mysrvc->max_replication_lag); @@ -615,6 +613,39 @@ void MySQL_HostGroups_Manager::add(MySrvC *mysrvc, unsigned int _hid) { } +void MySQL_HostGroups_Manager::replication_lag_action(int _hid, char *address, unsigned int port, int current_replication_lag) { + wrlock(); + int i,j; + for (i=0; i<(int)MyHostGroups->len; i++) { + MyHGC *myhgc=(MyHGC *)MyHostGroups->index(i); + if (_hid >= 0 && _hid!=(int)myhgc->hid) continue; + for (j=0; j<(int)myhgc->mysrvs->cnt(); j++) { + MySrvC *mysrvc=(MySrvC *)myhgc->mysrvs->servers->index(j); + if (strcmp(mysrvc->address,address)==0 && mysrvc->port==port) { + if (mysrvc->status==MYSQL_SERVER_STATUS_ONLINE) { + if ( + (current_replication_lag==-1 ) + || + (current_replication_lag>=0 && ((unsigned int)current_replication_lag > mysrvc->max_replication_lag)) + ) { + mysrvc->status=MYSQL_SERVER_STATUS_SHUNNED_REPLICATION_LAG; + } + } else { + if (mysrvc->status==MYSQL_SERVER_STATUS_SHUNNED_REPLICATION_LAG) { + if (current_replication_lag>=0 && ((unsigned int)current_replication_lag <= mysrvc->max_replication_lag)) { + mysrvc->status=MYSQL_SERVER_STATUS_ONLINE; + } + } + } + goto __exit_replication_lag_action; + } + } + } +__exit_replication_lag_action: + wrunlock(); +} + + int MySQL_HostGroups_Manager::get_multiple_idle_connections(int _hid, unsigned long long _max_last_time_used, MySQL_Connection **conn_list, int num_conn) { wrlock(); int num_conn_current=0; @@ -713,6 +744,9 @@ SQLite3_result * MySQL_HostGroups_Manager::SQL3_Connection_Pool() { case 3: pta[3]=strdup("OFFLINE_HARD"); break; + case 4: + pta[3]=strdup("SHUNNED_REPLICATION_LAG"); + break; default: assert(0); break; diff --git a/lib/MySQL_Monitor.cpp b/lib/MySQL_Monitor.cpp index 919694fa7..f3a6759df 100644 --- a/lib/MySQL_Monitor.cpp +++ b/lib/MySQL_Monitor.cpp @@ -887,6 +887,7 @@ __end_monitor_replication_lag_loop: assert(rc==SQLITE_OK); while (i>0) { i--; + int repl_lag=-1; MySQL_Monitor_State_Data *mmsd=sds[i]; rc=sqlite3_bind_text(statement, 1, mmsd->hostname, -1, SQLITE_TRANSIENT); assert(rc==SQLITE_OK); rc=sqlite3_bind_int(statement, 2, mmsd->port); assert(rc==SQLITE_OK); @@ -896,7 +897,6 @@ __end_monitor_replication_lag_loop: unsigned int num_fields; unsigned int k; int j=-1; - int repl_lag=-1; MYSQL_FIELD *fields; num_fields = mysql_num_fields(mmsd->result); @@ -926,6 +926,7 @@ __end_monitor_replication_lag_loop: SAFE_SQLITE3_STEP(statement); rc=sqlite3_clear_bindings(statement); assert(rc==SQLITE_OK); rc=sqlite3_reset(statement); assert(rc==SQLITE_OK); + MyHGM->replication_lag_action(mmsd->hostgroup_id, mmsd->hostname, mmsd->port, repl_lag); delete mmsd; } sqlite3_finalize(statement);