Drafting session_fast_forward (issue #36)

pull/249/head
René Cannaò 11 years ago
parent 414588e046
commit b8d6fe838b

@ -81,6 +81,7 @@ class MySQL_Session
bool admin;
bool connections_handler;
bool stats;
bool session_fast_forward;
void (*admin_func) (MySQL_Session *arg, ProxySQL_Admin *, PtrSize_t *pkt);
// int client_fd;
// int server_fd;

@ -60,6 +60,7 @@ enum session_status {
CHANGING_CHARSET,
CHANGING_USER_CLIENT,
CHANGING_USER_SERVER,
FAST_FORWARD,
NONE
};

@ -67,6 +67,7 @@ MySQL_Session::MySQL_Session() {
admin=false;
connections_handler=false;
stats=false;
session_fast_forward=false;
admin_func=NULL;
//client_fd=0;
//server_fd=0;
@ -177,7 +178,7 @@ int MySQL_Session::handler() {
unsigned int j;
unsigned char c;
if (session_fast_forward==false) {
if (client_myds==NULL) {
// if we are here, probably we are trying to ping backends
proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Processing session %p without client_myds\n", this);
@ -196,7 +197,7 @@ int MySQL_Session::handler() {
}
goto __exit_DSS__STATE_NOT_INITIALIZED;
}
}
for (j=0; j<client_myds->PSarrayIN->len;) {
client_myds->PSarrayIN->remove_index(0,&pkt);
//prot.parse_mysql_pkt(&pkt,client_myds);
@ -252,12 +253,14 @@ int MySQL_Session::handler() {
}
#endif /* DEBUG */
if (admin==false) {
if (session_fast_forward==false) {
CurrentQuery.init((unsigned char *)pkt.ptr,pkt.size,true);
CurrentQuery.start_time=thread->curtime;
CurrentQuery.query_parser_init();
CurrentQuery.query_parser_command_type();
CurrentQuery.query_parser_free();
client_myds->myprot.process_pkt_COM_QUERY((unsigned char *)pkt.ptr,pkt.size);
}
qpo=GloQPro->process_mysql_query(this,pkt.ptr,pkt.size,false);
if (qpo) {
bool rc_break=handler___status_WAITING_CLIENT_DATA___STATE_SLEEP___MYSQL_COM_QUERY_qpo(&pkt);
@ -315,13 +318,16 @@ int MySQL_Session::handler() {
default:
proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Statuses: WAITING_CLIENT_DATA - STATE_UNKNOWN\n");
assert(0); // FIXME: this should become close connection
}
}
break;
case FAST_FORWARD:
mybe->server_myds->PSarrayOUT->add(pkt.ptr, pkt.size);
break;
case NONE:
default:
assert(0);
break;
}
}
@ -333,7 +339,8 @@ __get_a_backend:
goto __exit_DSS__STATE_NOT_INITIALIZED;
}
if (client_myds->DSS==STATE_QUERY_SENT_NET) {
//if ((client_myds->DSS==STATE_QUERY_SENT_NET && session_fast_forward==false) || session_fast_forward==true) {
if (status!=FAST_FORWARD && client_myds->DSS==STATE_QUERY_SENT_NET) {
// the client has completely sent the query, now we should handle it server side
//
if (mybe && mybe->server_myds->DSS==STATE_NOT_INITIALIZED) {
@ -369,6 +376,10 @@ __get_a_backend:
// END OF if (server_myds->DSS==STATE_NOT_INITIALIZED)
//} else { TRY #1
} // TRY #1
if (session_fast_forward==true && mybe && mybe->server_myds && mybe->server_myds->myconn) {
mybe->server_myds->myconn->reusable=false;
}
if (session_fast_forward==false) {
if (mybe && mybe->server_myds->myds_type==MYDS_BACKEND && mybe->server_myds->DSS==STATE_READY) {
proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Sess=%p, client_myds->DSS==STATE_QUERY_SENT_NET , server_myds==STATE_READY , server_myds->myds_type==MYDS_BACKEND\n", this);
//if (strcmp(userinfo_client.schemaname,userinfo_server.schemaname)==0) {
@ -404,6 +415,7 @@ __get_a_backend:
}
}
// } TRY #1
}
}
__exit_DSS__STATE_NOT_INITIALIZED:
@ -432,7 +444,6 @@ __exit_DSS__STATE_NOT_INITIALIZED:
break;
case WAITING_SERVER_DATA:
switch (mybe->server_myds->DSS) {
case STATE_PING_SENT_NET:
handler___status_WAITING_SERVER_DATA___STATE_PING_SENT(&pkt);
@ -477,8 +488,13 @@ __exit_DSS__STATE_NOT_INITIALIZED:
}
break;
case FAST_FORWARD:
client_myds->PSarrayOUT->add(pkt.ptr, pkt.size);
break;
default:
assert(0);
assert(0);
break;
}
}
@ -936,6 +952,10 @@ void MySQL_Session::handler___status_CONNECTING_SERVER___STATE_CLIENT_HANDSHAKE(
}
// set prepared statement processing
mybe->server_myds->myconn->processing_prepared_statement_prepare=client_myds->myconn->processing_prepared_statement_prepare;
if (session_fast_forward==true) {
status=FAST_FORWARD;
myds->DSS=STATE_READY;
}
} else {
proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Wrong credentials for backend: disconnecting\n");
l_free(pkt->size,pkt->ptr);

@ -365,7 +365,7 @@ int MySQL_Data_Stream::read_pkts() {
int MySQL_Data_Stream::buffer2array() {
int ret=0;
int fast_mode=0;
bool fast_mode=sess->session_fast_forward;
if (queue_data(queueIN)==0) return ret;
if ((queueIN.pkt.size==0) && queue_data(queueIN)<sizeof(mysql_hdr)) {
queue_zero(queueIN);

@ -18,8 +18,8 @@ admin_variables=
mysql_variables=
{
//threads=4
threads=32
threads=1
//threads=32
have_compress=true
poll_timeout=2000
interfaces="127.0.0.1:6034"

Loading…
Cancel
Save