Merge branch 'issue446' into v1.1.1

SQLiteServer
René Cannaò 11 years ago
commit ccef9a5670

@ -229,7 +229,7 @@ class Query_Processor {
char * get_digest_text(void *args);
uint64_t get_digest(void *args);
void update_query_digest(void *p, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n);
void update_query_digest(void *p, int hid, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n);
unsigned long long query_parser_update_counters(MySQL_Session *sess, enum MYSQL_COM_QUERY_command c, void *p, unsigned long long t);

@ -67,9 +67,9 @@ pthread_mutex_t admin_mutex = PTHREAD_MUTEX_INITIALIZER;
#define STATS_SQLITE_TABLE_MYSQL_PROCESSLIST "CREATE TABLE stats_mysql_processlist (ThreadID INT NOT NULL , SessionID INTEGER PRIMARY KEY , user VARCHAR , db VARCHAR , cli_host VARCHAR , cli_port VARCHAR , hostgroup VARCHAR , l_srv_host VARCHAR , l_srv_port VARCHAR , srv_host VARCHAR , srv_port VARCHAR , command VARCHAR , time_ms INT NOT NULL , info VARCHAR)"
#define STATS_SQLITE_TABLE_MYSQL_CONNECTION_POOL "CREATE TABLE stats_mysql_connection_pool (hostgroup VARCHAR , srv_host VARCHAR , srv_port VARCHAR , status VARCHAR , ConnUsed INT , ConnFree INT , ConnOK INT , ConnERR INT , Queries INT , Bytes_data_sent INT , Bytes_data_recv INT)"
#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))"
#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST "CREATE TABLE stats_mysql_query_digest (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))"
#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(schemaname, username, digest))"
#define STATS_SQLITE_TABLE_MYSQL_QUERY_DIGEST_RESET "CREATE TABLE stats_mysql_query_digest_reset (hostgroup INT , schemaname VARCHAR NOT NULL , username VARCHAR NOT NULL , digest VARCHAR NOT NULL , digest_text VARCHAR NOT NULL , count_star INTEGER NOT NULL , first_seen INTEGER NOT NULL , last_seen INTEGER NOT NULL , sum_time INTEGER NOT NULL , min_time INTEGER NOT NULL , max_time INTEGER NOT NULL , PRIMARY KEY(hostgroup, schemaname, username, digest))"
#define STATS_SQLITE_TABLE_MYSQL_GLOBAL "CREATE TABLE stats_mysql_global (Variable_Name VARCHAR NOT NULL PRIMARY KEY , Variable_Value VARCHAR NOT NULL)"
@ -2597,15 +2597,15 @@ void ProxySQL_Admin::stats___mysql_query_digests() {
if (resultset==NULL) return;
statsdb->execute("BEGIN");
statsdb->execute("DELETE FROM stats_mysql_query_digest");
char *a=(char *)"INSERT INTO stats_mysql_query_digest VALUES (\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)";
char *a=(char *)"INSERT INTO stats_mysql_query_digest VALUES (%s,\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)";
for (std::vector<SQLite3_row *>::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) {
SQLite3_row *r=*it;
int arg_len=0;
for (int i=0; i<10; i++) {
for (int i=0; i<11; i++) {
arg_len+=strlen(r->fields[i]);
}
char *query=(char *)malloc(strlen(a)+arg_len+32);
sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]);
sprintf(query,a,r->fields[10],r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]);
statsdb->execute(query);
free(query);
}
@ -2619,15 +2619,15 @@ void ProxySQL_Admin::stats___mysql_query_digests_reset() {
if (resultset==NULL) return;
statsdb->execute("BEGIN");
statsdb->execute("DELETE FROM stats_mysql_query_digest_reset");
char *a=(char *)"INSERT INTO stats_mysql_query_digest_reset VALUES (\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)";
char *a=(char *)"INSERT INTO stats_mysql_query_digest_reset VALUES (%s,\"%s\",\"%s\",\"%s\",\"%s\",%s,%s,%s,%s,%s,%s)";
for (std::vector<SQLite3_row *>::iterator it = resultset->rows.begin() ; it != resultset->rows.end(); ++it) {
SQLite3_row *r=*it;
int arg_len=0;
for (int i=0; i<10; i++) {
for (int i=0; i<11; i++) {
arg_len+=strlen(r->fields[i]);
}
char *query=(char *)malloc(strlen(a)+arg_len+32);
sprintf(query,a,r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]);
sprintf(query,a,r->fields[10],r->fields[0],r->fields[1],r->fields[2],r->fields[3],r->fields[4],r->fields[5],r->fields[6],r->fields[7],r->fields[8],r->fields[9]);
statsdb->execute(query);
free(query);
}

@ -91,7 +91,8 @@ class QP_query_digest_stats {
unsigned long long sum_time;
unsigned long long min_time;
unsigned long long max_time;
QP_query_digest_stats(char *u, char *s, uint64_t d, char *dt) {
int hid;
QP_query_digest_stats(char *u, char *s, uint64_t d, char *dt, int h) {
digest=d;
digest_text=strdup(dt);
username=strdup(u);
@ -102,12 +103,13 @@ class QP_query_digest_stats {
sum_time=0;
min_time=0;
max_time=0;
hid=h;
}
void add_time(unsigned long long t, unsigned long long n) {
count_star++;
sum_time+=t;
if (t < min_time || min_time==0) {
min_time = t;
if (t) min_time = t;
}
if (t > max_time) {
max_time = t;
@ -133,7 +135,7 @@ class QP_query_digest_stats {
}
char **get_row() {
char buf[128];
char **pta=(char **)malloc(sizeof(char *)*10);
char **pta=(char **)malloc(sizeof(char *)*11);
assert(schemaname);
pta[0]=strdup(schemaname);
assert(username);
@ -176,11 +178,13 @@ class QP_query_digest_stats {
pta[8]=strdup(buf);
sprintf(buf,"%llu",max_time);
pta[9]=strdup(buf);
sprintf(buf,"%d",hid);
pta[10]=strdup(buf);
return pta;
}
void free_row(char **pta) {
int i;
for (i=0;i<10;i++) {
for (i=0;i<11;i++) {
assert(pta[i]);
free(pta[i]);
}
@ -564,8 +568,9 @@ SQLite3_result * Query_Processor::get_current_query_rules() {
SQLite3_result * Query_Processor::get_query_digests() {
proxy_debug(PROXY_DEBUG_MYSQL_QUERY_PROCESSOR, 4, "Dumping current query digest\n");
SQLite3_result *result=new SQLite3_result(10);
SQLite3_result *result=new SQLite3_result(11);
spin_rdlock(&digest_rwlock);
result->add_column_definition(SQLITE_TEXT,"hid");
result->add_column_definition(SQLITE_TEXT,"schemaname");
result->add_column_definition(SQLITE_TEXT,"usernname");
result->add_column_definition(SQLITE_TEXT,"digest");
@ -587,8 +592,9 @@ SQLite3_result * Query_Processor::get_query_digests() {
}
SQLite3_result * Query_Processor::get_query_digests_reset() {
SQLite3_result *result=new SQLite3_result(10);
SQLite3_result *result=new SQLite3_result(11);
spin_wrlock(&digest_rwlock);
result->add_column_definition(SQLITE_TEXT,"hid");
result->add_column_definition(SQLITE_TEXT,"schemaname");
result->add_column_definition(SQLITE_TEXT,"usernname");
result->add_column_definition(SQLITE_TEXT,"digest");
@ -877,14 +883,15 @@ unsigned long long Query_Processor::query_parser_update_counters(MySQL_Session *
myhash->Update(ui->username,strlen(ui->username));
myhash->Update(&qp->digest,sizeof(qp->digest));
myhash->Update(ui->schemaname,strlen(ui->schemaname));
myhash->Update(&sess->current_hostgroup,sizeof(sess->default_hostgroup));
myhash->Final(&qp->digest_total,&hash2);
delete myhash;
update_query_digest(qp, ui, t, sess->thread->curtime);
update_query_digest(qp, sess->current_hostgroup, ui, t, sess->thread->curtime);
}
return ret;
}
void Query_Processor::update_query_digest(void *p, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n) {
void Query_Processor::update_query_digest(void *p, int hid, MySQL_Connection_userinfo *ui, unsigned long long t, unsigned long long n) {
SQP_par_t *qp=(SQP_par_t *)p;
spin_wrlock(&digest_rwlock);
@ -897,7 +904,7 @@ void Query_Processor::update_query_digest(void *p, MySQL_Connection_userinfo *ui
qds=(QP_query_digest_stats *)it->second;
qds->add_time(t,n);
} else {
qds=new QP_query_digest_stats(ui->username, ui->schemaname, qp->digest, qp->digest_text);
qds=new QP_query_digest_stats(ui->username, ui->schemaname, qp->digest, qp->digest_text, hid);
qds->add_time(t,n);
digest_bt_map.insert(std::make_pair(qp->digest_total,(void *)qds));
}

Loading…
Cancel
Save