Enhancements for issue #329

- added global variables mysql-query_digests
- initialization if either mysql_thread___commands_stats or mysql_thread___query_digests are enabled
- query_parser_free() checks if QueryParserArgs was initialized
- Query_Processor::query_parser_init() checks the command type only if mysql_thread___commands_stats is true
- Query_Processor::query_parser_init() run mysql_query_digest() only if mysql_thread___query_digests is true
- Query_Processor::query_parser_update_counters() updates query digests only if digest_text is not null
- start time is always update (this is relevant for issue #327)
pull/332/head
René Cannaò 11 years ago
parent ad412fbf7d
commit f31b10ff0e

@ -262,6 +262,7 @@ class MySQL_Threads_Handler
uint8_t default_charset; uint8_t default_charset;
bool servers_stats; bool servers_stats;
bool commands_stats; bool commands_stats;
bool query_digests;
bool default_reconnect; bool default_reconnect;
bool have_compress; bool have_compress;
int max_transaction_time; int max_transaction_time;

@ -686,6 +686,7 @@ __thread int mysql_thread___poll_timeout_on_failure;
__thread bool mysql_thread___have_compress; __thread bool mysql_thread___have_compress;
__thread bool mysql_thread___servers_stats; __thread bool mysql_thread___servers_stats;
__thread bool mysql_thread___commands_stats; __thread bool mysql_thread___commands_stats;
__thread bool mysql_thread___query_digests;
__thread bool mysql_thread___default_reconnect; __thread bool mysql_thread___default_reconnect;
__thread bool mysql_thread___sessions_sort; __thread bool mysql_thread___sessions_sort;
@ -733,6 +734,7 @@ extern __thread int mysql_thread___poll_timeout_on_failure;
extern __thread bool mysql_thread___have_compress; extern __thread bool mysql_thread___have_compress;
extern __thread bool mysql_thread___servers_stats; extern __thread bool mysql_thread___servers_stats;
extern __thread bool mysql_thread___commands_stats; extern __thread bool mysql_thread___commands_stats;
extern __thread bool mysql_thread___query_digests;
extern __thread bool mysql_thread___default_reconnect; extern __thread bool mysql_thread___default_reconnect;
extern __thread bool mysql_thread___sessions_sort; extern __thread bool mysql_thread___sessions_sort;

@ -87,9 +87,9 @@ void Query_Info::begin(unsigned char *_p, int len, bool mysql_header) {
QueryPointer=NULL; QueryPointer=NULL;
QueryLength=0; QueryLength=0;
QueryParserArgs=NULL; QueryParserArgs=NULL;
if (mysql_thread___commands_stats) { start_time=sess->thread->curtime;
if (mysql_thread___commands_stats || mysql_thread___query_digests) {
init(_p, len, mysql_header); init(_p, len, mysql_header);
start_time=sess->thread->curtime;
query_parser_init(); query_parser_init();
query_parser_command_type(); query_parser_command_type();
} }
@ -106,7 +106,6 @@ void Query_Info::init(unsigned char *_p, int len, bool mysql_header) {
QueryPointer=(unsigned char *)l_alloc(QueryLength+1); QueryPointer=(unsigned char *)l_alloc(QueryLength+1);
memcpy(QueryPointer,(mysql_header ? _p+5 : _p),QueryLength); memcpy(QueryPointer,(mysql_header ? _p+5 : _p),QueryLength);
QueryPointer[QueryLength]=0; QueryPointer[QueryLength]=0;
//QueryPointer=(mysql_header ? _p+5 : _p);
QueryParserArgs=NULL; QueryParserArgs=NULL;
MyComQueryCmd=MYSQL_COM_QUERY_UNKNOWN; MyComQueryCmd=MYSQL_COM_QUERY_UNKNOWN;
} }
@ -121,8 +120,10 @@ enum MYSQL_COM_QUERY_command Query_Info::query_parser_command_type() {
} }
void Query_Info::query_parser_free() { void Query_Info::query_parser_free() {
GloQPro->query_parser_free(QueryParserArgs); if (QueryParserArgs) {
QueryParserArgs=NULL; GloQPro->query_parser_free(QueryParserArgs);
QueryParserArgs=NULL;
}
} }
unsigned long long Query_Info::query_parser_update_counters() { unsigned long long Query_Info::query_parser_update_counters() {

@ -168,6 +168,7 @@ static char * mysql_thread_variables_names[]= {
(char *)"server_version", (char *)"server_version",
(char *)"sessions_sort", (char *)"sessions_sort",
(char *)"commands_stats", (char *)"commands_stats",
(char *)"query_digests",
(char *)"servers_stats", (char *)"servers_stats",
(char *)"default_reconnect", (char *)"default_reconnect",
(char *)"session_debug", (char *)"session_debug",
@ -226,6 +227,7 @@ MySQL_Threads_Handler::MySQL_Threads_Handler() {
variables.poll_timeout_on_failure=100; variables.poll_timeout_on_failure=100;
variables.have_compress=true; variables.have_compress=true;
variables.commands_stats=true; variables.commands_stats=true;
variables.query_digests=true;
variables.sessions_sort=true; variables.sessions_sort=true;
variables.servers_stats=true; variables.servers_stats=true;
variables.default_reconnect=true; variables.default_reconnect=true;
@ -359,6 +361,7 @@ int MySQL_Threads_Handler::get_variable_int(char *name) {
if (!strcasecmp(name,"ping_timeout_server")) return (int)variables.ping_timeout_server; if (!strcasecmp(name,"ping_timeout_server")) return (int)variables.ping_timeout_server;
if (!strcasecmp(name,"have_compress")) return (int)variables.have_compress; if (!strcasecmp(name,"have_compress")) return (int)variables.have_compress;
if (!strcasecmp(name,"commands_stats")) return (int)variables.commands_stats; if (!strcasecmp(name,"commands_stats")) return (int)variables.commands_stats;
if (!strcasecmp(name,"query_digests")) return (int)variables.commands_stats;
if (!strcasecmp(name,"sessions_sort")) return (int)variables.sessions_sort; if (!strcasecmp(name,"sessions_sort")) return (int)variables.sessions_sort;
if (!strcasecmp(name,"servers_stats")) return (int)variables.servers_stats; if (!strcasecmp(name,"servers_stats")) return (int)variables.servers_stats;
if (!strcasecmp(name,"default_reconnect")) return (int)variables.default_reconnect; if (!strcasecmp(name,"default_reconnect")) return (int)variables.default_reconnect;
@ -498,6 +501,9 @@ char * MySQL_Threads_Handler::get_variable(char *name) { // this is the public f
if (!strcasecmp(name,"commands_stats")) { if (!strcasecmp(name,"commands_stats")) {
return strdup((variables.commands_stats ? "true" : "false")); return strdup((variables.commands_stats ? "true" : "false"));
} }
if (!strcasecmp(name,"query_digests")) {
return strdup((variables.query_digests ? "true" : "false"));
}
if (!strcasecmp(name,"sessions_sort")) { if (!strcasecmp(name,"sessions_sort")) {
return strdup((variables.sessions_sort ? "true" : "false")); return strdup((variables.sessions_sort ? "true" : "false"));
} }
@ -869,6 +875,17 @@ bool MySQL_Threads_Handler::set_variable(char *name, char *value) { // this is t
} }
return false; return false;
} }
if (!strcasecmp(name,"query_digests")) {
if (strcasecmp(value,"true")==0 || strcasecmp(value,"1")==0) {
variables.query_digests=true;
return true;
}
if (strcasecmp(value,"false")==0 || strcasecmp(value,"0")==0) {
variables.query_digests=false;
return true;
}
return false;
}
if (!strcasecmp(name,"sessions_sort")) { if (!strcasecmp(name,"sessions_sort")) {
if (strcasecmp(value,"true")==0 || strcasecmp(value,"1")==0) { if (strcasecmp(value,"true")==0 || strcasecmp(value,"1")==0) {
variables.sessions_sort=true; variables.sessions_sort=true;
@ -1501,6 +1518,7 @@ void MySQL_Thread::refresh_variables() {
mysql_thread___poll_timeout_on_failure=GloMTH->get_variable_int((char *)"poll_timeout_on_failure"); mysql_thread___poll_timeout_on_failure=GloMTH->get_variable_int((char *)"poll_timeout_on_failure");
mysql_thread___have_compress=(bool)GloMTH->get_variable_int((char *)"have_compress"); mysql_thread___have_compress=(bool)GloMTH->get_variable_int((char *)"have_compress");
mysql_thread___commands_stats=(bool)GloMTH->get_variable_int((char *)"commands_stats"); mysql_thread___commands_stats=(bool)GloMTH->get_variable_int((char *)"commands_stats");
mysql_thread___query_digests=(bool)GloMTH->get_variable_int((char *)"query_digests");
mysql_thread___sessions_sort=(bool)GloMTH->get_variable_int((char *)"sessions_sort"); mysql_thread___sessions_sort=(bool)GloMTH->get_variable_int((char *)"sessions_sort");
mysql_thread___servers_stats=(bool)GloMTH->get_variable_int((char *)"servers_stats"); mysql_thread___servers_stats=(bool)GloMTH->get_variable_int((char *)"servers_stats");
mysql_thread___default_reconnect=(bool)GloMTH->get_variable_int((char *)"default_reconnect"); mysql_thread___default_reconnect=(bool)GloMTH->get_variable_int((char *)"default_reconnect");

@ -786,11 +786,13 @@ void Query_Processor::update_query_processor_stats() {
void * Query_Processor::query_parser_init(char *query, int query_length, int flags) { void * Query_Processor::query_parser_init(char *query, int query_length, int flags) {
SQP_par_t *qp=(SQP_par_t *)malloc(sizeof(SQP_par_t)); SQP_par_t *qp=(SQP_par_t *)malloc(sizeof(SQP_par_t));
libinjection_sqli_init(&qp->sf, query, query_length, FLAG_SQL_MYSQL); if (mysql_thread___commands_stats)
libinjection_sqli_init(&qp->sf, query, query_length, FLAG_SQL_MYSQL);
qp->digest_text=NULL; qp->digest_text=NULL;
qp->digest_text=mysql_query_digest(query, query_length); if (mysql_thread___query_digests) {
qp->digest=SpookyHash::Hash64(qp->digest_text,strlen(qp->digest_text),0); qp->digest_text=mysql_query_digest(query, query_length);
qp->digest=SpookyHash::Hash64(qp->digest_text,strlen(qp->digest_text),0);
}
return (void *)qp; return (void *)qp;
}; };
@ -806,24 +808,25 @@ unsigned long long Query_Processor::query_parser_update_counters(MySQL_Session *
SQP_par_t *qp=(SQP_par_t *)p; SQP_par_t *qp=(SQP_par_t *)p;
uint64_t hash2; if (qp->digest_text) {
SpookyHash *myhash=new SpookyHash(); // this code is executed only if digest_text is not NULL , that means mysql_thread___query_digests was true when the query started
myhash->Init(19,3); uint64_t hash2;
assert(sess); SpookyHash *myhash=new SpookyHash();
assert(sess->client_myds); myhash->Init(19,3);
assert(sess->client_myds->myconn); assert(sess);
assert(sess->client_myds->myconn->userinfo); assert(sess->client_myds);
MySQL_Connection_userinfo *ui=sess->client_myds->myconn->userinfo; assert(sess->client_myds->myconn);
assert(ui->username); assert(sess->client_myds->myconn->userinfo);
assert(ui->schemaname); MySQL_Connection_userinfo *ui=sess->client_myds->myconn->userinfo;
myhash->Update(ui->username,strlen(ui->username)); assert(ui->username);
myhash->Update(&qp->digest,sizeof(qp->digest)); assert(ui->schemaname);
myhash->Update(ui->schemaname,strlen(ui->schemaname)); myhash->Update(ui->username,strlen(ui->username));
myhash->Final(&qp->digest_total,&hash2); myhash->Update(&qp->digest,sizeof(qp->digest));
delete myhash; myhash->Update(ui->schemaname,strlen(ui->schemaname));
myhash->Final(&qp->digest_total,&hash2);
update_query_digest(qp, ui, t, sess->thread->curtime); delete myhash;
update_query_digest(qp, ui, t, sess->thread->curtime);
}
return ret; return ret;
} }

Loading…
Cancel
Save