From 8083561058a1023c6c6872d0a7bdb6580f430d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 1 May 2020 23:36:51 +0200 Subject: [PATCH 1/3] Added a comment in MySQL_Session.cpp --- lib/MySQL_Session.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index a6a78793c..e9ed43af9 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -4165,6 +4165,7 @@ __exit_DSS__STATE_NOT_INITIALIZED: handler_ret = 0; return handler_ret; } +// end ::handler() void MySQL_Session::handler___status_WAITING_SERVER_DATA___STATE_READING_COM_STMT_PREPARE_RESPONSE(PtrSize_t *pkt) { From 308639d0dc8039448282b114d3658a7248873953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 2 May 2020 01:09:47 +0200 Subject: [PATCH 2/3] Renamed session_status NONE to session_status___NONE --- include/proxysql_structs.h | 4 ++-- lib/MySQL_Session.cpp | 12 ++++++------ lib/MySQL_Thread.cpp | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/proxysql_structs.h b/include/proxysql_structs.h index 97f8e1e1c..69fa59894 100644 --- a/include/proxysql_structs.h +++ b/include/proxysql_structs.h @@ -196,7 +196,7 @@ enum session_status { SETTING_VARIABLE, SETTING_MULTIPLE_VARIABLES, SETTING_SET_NAMES, - NONE + session_status___NONE // special marker }; #ifdef __cplusplus @@ -992,7 +992,7 @@ typedef struct { */ mysql_variable_st mysql_tracked_variables[] { { SQL_CHARACTER_SET, SETTING_CHARSET, false, true, false, false, false, (char *)"CHARSET", (char *)"CHARSET", (char *)"UTF8" } , // should be before SQL_CHARACTER_SET_RESULTS - { SQL_CHARACTER_ACTION, NONE, false, false, false, false, false, (char *)"action", (char *)"action", (char *)"1" } , + { SQL_CHARACTER_ACTION, session_status___NONE,false, false, false, false, false, (char *)"action", (char *)"action", (char *)"1" } , { SQL_SET_NAMES, SETTING_SET_NAMES, false, false, false, false, false, (char *)"names", (char *)"names", (char *)"DEFAULT" } , { SQL_SAFE_UPDATES, SETTING_VARIABLE, true, false, true, false, true, (char *)"sql_safe_updates", (char *)"sql_safe_updates", (char *)"OFF" } , { SQL_SELECT_LIMIT, SETTING_VARIABLE, false, false, true, true, false, (char *)"sql_select_limit", (char *)"sql_select_limit", (char *)"DEFAULT" } , diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index e9ed43af9..5fd643635 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -412,7 +412,7 @@ void MySQL_Session::operator delete(void *ptr) { void MySQL_Session::set_status(enum session_status e) { - if (e==NONE) { + if (e==session_status___NONE) { if (mybe) { if (mybe->server_myds) { assert(mybe->server_myds->myconn==0); @@ -455,7 +455,7 @@ MySQL_Session::MySQL_Session() { mirror=false; mirrorPkt.ptr=NULL; mirrorPkt.size=0; - set_status(NONE); + set_status(session_status___NONE); CurrentQuery.sess=this; @@ -1440,7 +1440,7 @@ int MySQL_Session::handler_again___status_PINGING_SERVER() { } delete mybe->server_myds; mybe->server_myds=NULL; - set_status(NONE); + set_status(session_status___NONE); return -1; } else { if (rc==-1 || rc==-2) { @@ -1494,7 +1494,7 @@ int MySQL_Session::handler_again___status_RESETTING_CONNECTION() { // } delete mybe->server_myds; mybe->server_myds=NULL; - set_status(NONE); + set_status(session_status___NONE); return -1; } else { if (rc==-1 || rc==-2) { @@ -3346,7 +3346,7 @@ __get_pkts_from_client: case FAST_FORWARD: mybe->server_myds->PSarrayOUT->add(pkt.ptr, pkt.size); break; - case NONE: + case session_status___NONE: default: { char buf[INET6_ADDRSTRLEN]; @@ -4134,7 +4134,7 @@ handler_again: goto __exit_DSS__STATE_NOT_INITIALIZED; } break; - case NONE: + case session_status___NONE: fprintf(stderr,"NONE\n"); default: break; diff --git a/lib/MySQL_Thread.cpp b/lib/MySQL_Thread.cpp index 60b6a1fe8..009d3c326 100644 --- a/lib/MySQL_Thread.cpp +++ b/lib/MySQL_Thread.cpp @@ -4047,13 +4047,13 @@ bool MySQL_Thread::process_data_on_data_stream(MySQL_Data_Stream *myds, unsigned mypolls.last_recv[n]=curtime; myds->revents=mypolls.fds[n].revents; myds->sess->to_process=1; - assert(myds->sess->status!=NONE); + assert(myds->sess->status!=session_status___NONE); } else { // no events if (myds->wait_until && curtime > myds->wait_until) { // timeout myds->sess->to_process=1; - assert(myds->sess->status!=NONE); + assert(myds->sess->status!=session_status___NONE); } else { if (myds->sess->pause_until && curtime > myds->sess->pause_until) { // timeout @@ -5453,7 +5453,7 @@ SQLite3_result * MySQL_Threads_Handler::SQL3_Processlist() { case FAST_FORWARD: pta[11]=strdup("Fast forward"); break; - case NONE: + case session_status___NONE: pta[11]=strdup("None"); break; default: From 8d6b48f21d65536f5bf09a623c7b0b79ed631e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 4 May 2020 18:15:17 +0200 Subject: [PATCH 3/3] Adding new method MySQL_Session::handler_again___multiple_statuses() First commit to simplify MySQL_Session::handler() It handles the following statuses: * CHANGING_USER_SERVER * CHANGING_AUTOCOMMIT * SETTING_MULTI_STMT * SETTING_SESSION_TRACK_GTIDS * SETTING_SET_NAMES --- include/MySQL_Session.h | 1 + lib/MySQL_Session.cpp | 138 ++++++++++++---------------------------- 2 files changed, 43 insertions(+), 96 deletions(-) diff --git a/include/MySQL_Session.h b/include/MySQL_Session.h index f3dfe5b5a..8b41906db 100644 --- a/include/MySQL_Session.h +++ b/include/MySQL_Session.h @@ -125,6 +125,7 @@ class MySQL_Session bool handler_again___status_CHANGING_USER_SERVER(int *); bool handler_again___status_CHANGING_AUTOCOMMIT(int *); bool handler_again___status_SETTING_MULTI_STMT(int *_rc); + bool handler_again___multiple_statuses(int *rc); void init(); void reset(); void add_ldap_comment_to_pkt(PtrSize_t *); diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 5fd643635..fb72eeaf1 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -4013,66 +4013,6 @@ handler_again: } break; - case CHANGING_USER_SERVER: - { - int rc=0; - if (handler_again___status_CHANGING_USER_SERVER(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case CHANGING_AUTOCOMMIT: - { - int rc=0; - if (handler_again___status_CHANGING_AUTOCOMMIT(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case SETTING_MULTI_STMT: - { - int rc=0; - if (handler_again___status_SETTING_MULTI_STMT(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case SETTING_SESSION_TRACK_GTIDS: - { - int rc=0; - if (handler_again___status_SETTING_SESSION_TRACK_GTIDS(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case SETTING_SET_NAMES: - { - int rc=0; - if (handler_again___status_CHANGING_CHARSET(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - case SETTING_ISOLATION_LEVEL: case SETTING_TRANSACTION_READ: case SETTING_CHARSET: @@ -4089,42 +4029,6 @@ handler_again: } break; - case SETTING_INIT_CONNECT: - { - int rc=0; - if (handler_again___status_SETTING_INIT_CONNECT(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case SETTING_LDAP_USER_VARIABLE: - { - int rc=0; - if (handler_again___status_SETTING_LDAP_USER_VARIABLE(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - - case CHANGING_SCHEMA: - { - int rc=0; - if (handler_again___status_CHANGING_SCHEMA(&rc)) - goto handler_again; // we changed status - if (rc==-1) { // we have an error we can't handle - handler_ret = -1; - return handler_ret; - } - } - break; - case CONNECTING_SERVER: { int rc=0; @@ -4137,6 +4041,15 @@ handler_again: case session_status___NONE: fprintf(stderr,"NONE\n"); default: + { + int rc = 0; + if (handler_again___multiple_statuses(&rc)) // a sort of catch all + goto handler_again; // we changed status + if (rc==-1) { // we have an error we can't handle + handler_ret = -1; + return handler_ret; + } + } break; } @@ -4168,6 +4081,39 @@ __exit_DSS__STATE_NOT_INITIALIZED: // end ::handler() +bool MySQL_Session::handler_again___multiple_statuses(int *rc) { + bool ret = false; + switch(status) { + case CHANGING_USER_SERVER: + ret = handler_again___status_CHANGING_USER_SERVER(rc); + break; + case CHANGING_AUTOCOMMIT: + ret = handler_again___status_CHANGING_AUTOCOMMIT(rc); + break; + case CHANGING_SCHEMA: + ret = handler_again___status_CHANGING_SCHEMA(rc); + break; + case SETTING_LDAP_USER_VARIABLE: + ret = handler_again___status_SETTING_LDAP_USER_VARIABLE(rc); + break; + case SETTING_INIT_CONNECT: + ret = handler_again___status_SETTING_INIT_CONNECT(rc); + break; + case SETTING_MULTI_STMT: + ret = handler_again___status_SETTING_MULTI_STMT(rc); + break; + case SETTING_SESSION_TRACK_GTIDS: + ret = handler_again___status_SETTING_SESSION_TRACK_GTIDS(rc); + break; + case SETTING_SET_NAMES: + ret = handler_again___status_CHANGING_CHARSET(rc); + break; + default: + break; + } + return ret; +} + void MySQL_Session::handler___status_WAITING_SERVER_DATA___STATE_READING_COM_STMT_PREPARE_RESPONSE(PtrSize_t *pkt) { unsigned char c; c=*((unsigned char *)pkt->ptr+sizeof(mysql_hdr));