Dump in error log status of mysql_servers during reconfiguration

Close issue #1255
pull/1269/head
René Cannaò 9 years ago
parent b8e490bcc2
commit 4fb9e3f88b

@ -160,6 +160,7 @@ class SQLite3_result {
delete r;
}
};
void dump_to_stderr();
};
class SQLite3DB {

@ -564,6 +564,18 @@ bool MySQL_HostGroups_Manager::commit() {
int cols=0;
int affected_rows=0;
SQLite3_result *resultset=NULL;
if (GloMTH->variables.hostgroup_manager_verbose) {
mydb->execute_statement((char *)"SELECT * FROM mysql_servers_incoming", &error , &cols , &affected_rows , &resultset);
if (error) {
proxy_error("Error on read from mysql_servers_incoming : %s\n", error);
} else {
if (resultset) {
proxy_info("Dumping mysql_servers_incoming\n");
resultset->dump_to_stderr();
}
}
if (resultset) { delete resultset; resultset=NULL; }
}
char *query=NULL;
query=(char *)"SELECT mem_pointer, t1.hostgroup_id, t1.hostname, t1.port FROM mysql_servers t1 LEFT OUTER JOIN mysql_servers_incoming t2 ON (t1.hostgroup_id=t2.hostgroup_id AND t1.hostname=t2.hostname AND t1.port=t2.port) WHERE t2.hostgroup_id IS NULL";
mydb->execute_statement(query, &error , &cols , &affected_rows , &resultset);
@ -975,6 +987,22 @@ void MySQL_HostGroups_Manager::generate_mysql_servers_table(int *_onlyhg) {
}
sqlite3_finalize(statement1);
sqlite3_finalize(statement32);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error=NULL;
int cols=0;
int affected_rows=0;
SQLite3_result *resultset=NULL;
mydb->execute_statement((char *)"SELECT * FROM mysql_servers", &error , &cols , &affected_rows , &resultset);
if (error) {
proxy_error("Error on read from mysql_servers : %s\n", error);
} else {
if (resultset) {
proxy_info("Dumping mysql_servers\n");
resultset->dump_to_stderr();
}
}
if (resultset) { delete resultset; resultset=NULL; }
}
}
void MySQL_HostGroups_Manager::generate_mysql_replication_hostgroups_table() {
@ -1748,7 +1776,49 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re
if (num_rows==0) {
// the server has read_only=0 , but we can't find any writer, so we perform a swap
GloAdmin->mysql_servers_wrlock();
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 phase 1 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->save_mysql_servers_runtime_to_database(false); // SAVE MYSQL SERVERS FROM RUNTIME
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 phase 2 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
sprintf(query,Q2B,hostname,port);
admindb->execute(query);
if (mysql_thread___monitor_writer_is_also_reader) {
@ -1757,6 +1827,27 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re
sprintf(query,Q3B,hostname,port);
}
admindb->execute(query);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 phase 3 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->load_mysql_servers_to_runtime(); // LOAD MYSQL SERVERS TO RUNTIME
GloAdmin->mysql_servers_wrunlock();
} else {
@ -1779,17 +1870,80 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re
}
if (act==true) { // there are servers either missing, or with stats=OFFLINE_HARD
GloAdmin->mysql_servers_wrlock();
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 , rows=%d , phase 1 : Dumping mysql_servers for %s:%d\n", num_rows, hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->save_mysql_servers_runtime_to_database(false); // SAVE MYSQL SERVERS FROM RUNTIME
sprintf(query,Q2A,hostname,port);
admindb->execute(query);
sprintf(query,Q2B,hostname,port);
admindb->execute(query);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 , rows=%d , phase 2 : Dumping mysql_servers for %s:%d\n", num_rows, hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
if (mysql_thread___monitor_writer_is_also_reader) {
sprintf(query,Q3A,hostname,port);
} else {
sprintf(query,Q3B,hostname,port);
}
admindb->execute(query);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=0 , rows=%d , phase 3 : Dumping mysql_servers for %s:%d\n", num_rows, hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->load_mysql_servers_to_runtime(); // LOAD MYSQL SERVERS TO RUNTIME
GloAdmin->mysql_servers_wrunlock();
}
@ -1799,11 +1953,74 @@ void MySQL_HostGroups_Manager::read_only_action(char *hostname, int port, int re
if (num_rows) {
// the server has read_only=1 , but we find it as writer, so we perform a swap
GloAdmin->mysql_servers_wrlock();
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=1 phase 1 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->save_mysql_servers_runtime_to_database(false); // SAVE MYSQL SERVERS FROM RUNTIME
sprintf(query,Q4,hostname,port);
admindb->execute(query);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=1 phase 2 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
sprintf(query,Q5,hostname,port);
admindb->execute(query);
if (GloMTH->variables.hostgroup_manager_verbose) {
char *error2=NULL;
int cols2=0;
int affected_rows2=0;
SQLite3_result *resultset2=NULL;
char * query2 = NULL;
char *q = (char *)"SELECT * FROM mysql_servers WHERE hostname=\"%s\" AND port=%d";
query2 = (char *)malloc(strlen(q)+strlen(hostname)+32);
sprintf(query2,q,hostname,port);
admindb->execute_statement(query2, &error2 , &cols2 , &affected_rows2 , &resultset2);
if (error2) {
proxy_error("Error on read from mysql_servers : %s\n", error2);
} else {
if (resultset2) {
proxy_info("read_only_action RO=1 phase 3 : Dumping mysql_servers for %s:%d\n", hostname, port);
resultset2->dump_to_stderr();
}
}
if (resultset2) { delete resultset2; resultset2=NULL; }
free(query2);
}
GloAdmin->load_mysql_servers_to_runtime(); // LOAD MYSQL SERVERS TO RUNTIME
GloAdmin->mysql_servers_wrunlock();
}

@ -282,3 +282,103 @@ char *SQLite3_result::checksum() {
sprintf(buf,"0x%X%X", d32[0], d32[1]);
return strdup(buf);
}
void SQLite3_result::dump_to_stderr() {
if (columns == 0) return;
size_t *columns_lengths = (size_t *)malloc(sizeof(size_t)*columns);
int i = 0;
for (i = 0; i<columns; i++) {
columns_lengths[i] = 0;
}
i = 0;
for (std::vector<SQLite3_column *>::iterator it=column_definition.begin() ; it!=column_definition.end(); ++it) {
SQLite3_column *r=*it;
size_t len = strlen(r->name);
if (len > columns_lengths[i]) {
columns_lengths[i] = len;
i++;
}
}
for (std::vector<SQLite3_row *>::iterator it=rows.begin() ; it!=rows.end(); ++it) {
SQLite3_row *r=*it;
for (int i=0; i<columns;i++) {
if (r->fields[i]) {
if (r->sizes[i] > columns_lengths[i]) {
columns_lengths[i] = r->sizes[i];
}
} else {
if (columns_lengths[i] < 4) {
columns_lengths[i] = 4; // NULL
}
}
}
}
string s;
s = "+";
for (i=0; i<columns; i++) {
int j;
for (j=0; j < columns_lengths[i] + 2; j++) {
s.append("-");
}
s.append("+");
}
fprintf(stderr,"%s\n",s.c_str());
s = "|";
i = 0;
for (std::vector<SQLite3_column *>::iterator it=column_definition.begin() ; it!=column_definition.end(); ++it) {
SQLite3_column *r=*it;
size_t len = strlen(r->name);
s.append(" ");
s.append(r->name);
int j;
for (j=0; j < columns_lengths[i] - len + 1 ; j++) {
s.append(" ");
}
s.append("|");
i++;
}
fprintf(stderr,"%s\n",s.c_str());
s = "+";
for (i=0; i<columns; i++) {
int j;
for (j=0; j < columns_lengths[i] + 2 ; j++) {
s.append("-");
}
s.append("+");
}
fprintf(stderr,"%s\n",s.c_str());
for (std::vector<SQLite3_row *>::iterator it=rows.begin() ; it!=rows.end(); ++it) {
SQLite3_row *r=*it;
s = "|";
i = 0;
for (int i=0; i<columns;i++) {
s.append(" ");
int len = 0;
if (r->fields[i]) {
len = r->sizes[i];
s.append(r->fields[i]);
} else {
len = 4;
s.append("NULL");
}
int j;
for (j=0; j < columns_lengths[i] - len + 1 ; j++) {
s.append(" ");
}
s.append("|");
}
fprintf(stderr,"%s\n",s.c_str());
}
s = "+";
for (i=0; i<columns; i++) {
int j;
for (j=0; j < columns_lengths[i] + 2 ; j++) {
s.append("-");
}
s.append("+");
}
fprintf(stderr,"%s\n",s.c_str());
}

Loading…
Cancel
Save