More development on #358

Added status MYSQL_SERVER_STATUS_SHUNNED_REPLICATION_LAG as internal only (not configurable)
Added MySQL_HostGroups_Manager::replication_lag_action() to communicate replication lag to connection pool and take action
pull/378/head
René Cannaò 11 years ago
parent ea880ffaf3
commit 95b971a660

@ -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 */

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

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

Loading…
Cancel
Save