From 17ddec943eaa073fe9d6315bd9a1f4d40ca71b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Sat, 21 Feb 2015 23:11:22 +0000 Subject: [PATCH] Added variables ping_timout_server and ping_interval_server Issues #205 and #206 --- include/mysql_data_stream.h | 1 + include/mysql_thread.h | 4 +++ lib/MySQL_Session.cpp | 18 ++++++++++ lib/Standard_MySQL_Thread.cpp | 65 +++++++++++++++++++++++++++++++---- lib/mysql_data_stream.cpp | 1 + 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/include/mysql_data_stream.h b/include/mysql_data_stream.h index 65853cd80..3781eecb8 100644 --- a/include/mysql_data_stream.h +++ b/include/mysql_data_stream.h @@ -57,6 +57,7 @@ class MySQL_Data_Stream bytes_stats_t bytes_info; // bytes statistics int fd; // file descriptor + unsigned long long timeout; int poll_fds_idx; short revents; diff --git a/include/mysql_thread.h b/include/mysql_thread.h index cd4677c08..05c774125 100644 --- a/include/mysql_thread.h +++ b/include/mysql_thread.h @@ -284,6 +284,8 @@ class Standard_MySQL_Threads_Handler: public MySQL_Threads_Handler pthread_attr_t attr; rwlock_t rwlock; struct { + int ping_interval_server; + int ping_timeout_server; int connect_timeout_server; char *connect_timeout_server_error; char *default_schema; @@ -332,6 +334,8 @@ typedef void destroy_MySQL_Threads_Handler_t(MySQL_Threads_Handler *); __EXTERN __thread char *mysql_thread___default_schema; __EXTERN __thread char *mysql_thread___server_version; +__EXTERN __thread int mysql_thread___ping_interval_server; +__EXTERN __thread int mysql_thread___ping_timeout_server; __EXTERN __thread int mysql_thread___connect_timeout_server; __EXTERN __thread char *mysql_thread___connect_timeout_server_error; __EXTERN __thread uint16_t mysql_thread___server_capabilities; diff --git a/lib/MySQL_Session.cpp b/lib/MySQL_Session.cpp index 0e79f8bc7..3695f5355 100644 --- a/lib/MySQL_Session.cpp +++ b/lib/MySQL_Session.cpp @@ -277,6 +277,22 @@ int MySQL_Session::handler() { */ 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); + assert(mybe); + assert(mybe->server_myds); + assert(mybe->server_myds->myconn); + if (mybe->server_myds->DSS==STATE_PING_SENT_NET) { + proxy_debug(PROXY_DEBUG_MYSQL_CONNECTION, 5, "Processing session %p without client_myds . server_myds=%p , myconn=%p , fd=%d , timeout=%llu , curtime=%llu\n", this, mybe->server_myds , mybe->server_myds->myconn, mybe->server_myds->myconn->fd , mybe->server_myds->timeout , thread->curtime); + //fprintf(stderr,"Processing session %p without client_myds . server_myds=%p , myconn=%p , fd=%d , timeout=%llu , curtime=%llu , time=%llu\n", this, mybe->server_myds , mybe->server_myds->myconn, mybe->server_myds->myconn->fd , mybe->server_myds->timeout , thread->curtime, monotonic_time()); + if (mybe->server_myds->timeout < thread->curtime) { + MyHGM->destroy_MyConn_from_pool(mybe->server_myds->myconn); + mybe->server_myds->myconn=NULL; + mybe->server_myds->fd=-1; + thread->mypolls.remove_index_fast(mybe->server_myds->poll_fds_idx); + return -1; + } + } goto __exit_DSS__STATE_NOT_INITIALIZED; } @@ -542,6 +558,8 @@ __exit_DSS__STATE_NOT_INITIALIZED: mybe->server_myds->available_data_out()==false ) { if (connections_handler) { + //fprintf(stderr,"time=%llu\n",monotonic_time()); + //mybe->server_myds->timeout=thread->curtime+100; mybe->server_myds->DSS=STATE_PING_SENT_NET; } else { mybe->server_myds->setDSS_STATE_QUERY_SENT_NET(); diff --git a/lib/Standard_MySQL_Thread.cpp b/lib/Standard_MySQL_Thread.cpp index 78728d6e0..d11221356 100644 --- a/lib/Standard_MySQL_Thread.cpp +++ b/lib/Standard_MySQL_Thread.cpp @@ -187,6 +187,8 @@ volatile static unsigned int __global_MySQL_Thread_Variables_version; static char * mysql_thread_variables_names[]= { (char *)"connect_timeout_server", (char *)"connect_timeout_server_error", + (char *)"ping_interval_server", + (char *)"ping_timeout_server", (char *)"default_schema", (char *)"poll_timeout", (char *)"server_capabilities", @@ -267,6 +269,8 @@ Standard_MySQL_Threads_Handler::Standard_MySQL_Threads_Handler() { spinlock_rwlock_init(&rwlock); pthread_attr_init(&attr); variables.connect_timeout_server=10000; + variables.ping_interval_server=5000; + variables.ping_timeout_server=100; variables.connect_timeout_server_error=strdup((char *)"#2003:Can't connect to MySQL server"); variables.default_schema=strdup((char *)"information_schema"); variables.server_version=strdup((char *)"5.1.30"); @@ -311,6 +315,8 @@ int Standard_MySQL_Threads_Handler::get_variable_int(char *name) { if (!strcmp(name,"session_debug")) return (int)variables.session_debug; #endif /* DEBUG */ if (!strcasecmp(name,"connect_timeout_server")) return (int)variables.connect_timeout_server; + if (!strcasecmp(name,"ping_interval_server")) return (int)variables.ping_interval_server; + if (!strcasecmp(name,"ping_timeout_server")) return (int)variables.ping_timeout_server; if (!strcmp(name,"servers_stats")) return (int)variables.servers_stats; if (!strcmp(name,"poll_timeout")) return variables.poll_timeout; if (!strcmp(name,"stacksize")) return ( stacksize ? stacksize : DEFAULT_STACK_SIZE); @@ -333,6 +339,14 @@ char * Standard_MySQL_Threads_Handler::get_variable(char *name) { // this is the sprintf(intbuf,"%d",variables.connect_timeout_server); return strdup(intbuf); } + if (!strcasecmp(name,"ping_interval_server")) { + sprintf(intbuf,"%d",variables.ping_interval_server); + return strdup(intbuf); + } + if (!strcasecmp(name,"ping_timeout_server")) { + sprintf(intbuf,"%d",variables.ping_timeout_server); + return strdup(intbuf); + } if (!strcmp(name,"poll_timeout")) { sprintf(intbuf,"%d",variables.poll_timeout); return strdup(intbuf); @@ -369,6 +383,24 @@ bool Standard_MySQL_Threads_Handler::set_variable(char *name, char *value) { // // size_t vallen=strlen(value); + if (!strcasecmp(name,"ping_interval_server")) { + int intv=atoi(value); + if (intv > 1000 && intv < 7*24*3600*1000) { + variables.ping_interval_server=intv; + return true; + } else { + return false; + } + } + if (!strcasecmp(name,"ping_timeout_server")) { + int intv=atoi(value); + if (intv > 10 && intv < 600000) { + variables.ping_timeout_server=intv; + return true; + } else { + return false; + } + } if (!strcasecmp(name,"connect_timeout_server")) { int intv=atoi(value); if (intv > 10 && intv < 600000) { @@ -566,6 +598,8 @@ Standard_MySQL_Thread() { void refresh_variables() { GloMTH->wrlock(); __thread_MySQL_Thread_Variables_version=__global_MySQL_Thread_Variables_version; + mysql_thread___ping_interval_server=GloMTH->get_variable_int((char *)"ping_interval_server"); + mysql_thread___ping_timeout_server=GloMTH->get_variable_int((char *)"ping_timeout_server"); mysql_thread___connect_timeout_server=GloMTH->get_variable_int((char *)"connect_timeout_server"); if (mysql_thread___connect_timeout_server_error) free(mysql_thread___connect_timeout_server_error); mysql_thread___connect_timeout_server_error=GloMTH->get_variable_string((char *)"connect_timeout_server_error"); @@ -729,9 +763,9 @@ virtual void run() { while (shutdown==0) { int num_idles; - if (processing_idles==false && (last_processing_idles < curtime-5*1000000) ) { + if (processing_idles==false && (last_processing_idles < curtime-mysql_thread___ping_interval_server*1000) ) { int i; - num_idles=MyHGM->get_multiple_idle_connections(-1, curtime-5*1000000, my_idle_conns, SESSIONS_FOR_CONNECTIONS_HANDLER); + num_idles=MyHGM->get_multiple_idle_connections(-1, curtime-mysql_thread___ping_interval_server*1000, my_idle_conns, SESSIONS_FOR_CONNECTIONS_HANDLER); for (i=0; imybe=sess->find_or_create_backend(mc->parent->myhgc->hid); sess->mybe->server_myds=myds; sess->to_process=1; + myds->timeout=curtime+mysql_thread___ping_timeout_server*1000; // max_timeout sess->status=WAITING_SERVER_DATA; myds->mypolls=&mypolls; mc->last_time_used=curtime; @@ -759,7 +794,9 @@ virtual void run() { } } - if (processing_idles==true && (last_processing_idles < curtime-2*1000000)) { + if (processing_idles==true && (last_processing_idles < curtime-10*mysql_thread___ping_timeout_server*1000)) { + processing_idles=false; +/* int i; for (i=0; imyds_type!=MYDS_LISTENER && mypolls.myds[n]->myds_type!=MYDS_BACKEND_PAUSE_CONNECT) { @@ -978,6 +1015,7 @@ void process_all_sessions() { void process_all_sessions_connections_handler(); void register_session_connection_handler(MySQL_Session *_sess); + void unregister_session_connection_handler(int idx); void myds_backend_set_failed_connect(MySQL_Data_Stream *myds, unsigned int n); void myds_backend_pause_connect(MySQL_Data_Stream *myds); void myds_backend_first_packet_after_connect(MySQL_Data_Stream *myds, unsigned int n); @@ -992,8 +1030,17 @@ void Standard_MySQL_Thread::process_all_sessions_connections_handler() { for (n=0; nlen; n++) { MySQL_Session *sess=(MySQL_Session *)mysql_sessions_connections_handler->index(n); if (sess->to_process==1) { - sess->handler(); - sess->to_process=0; + rc=sess->handler(); + if (rc==-1) { + unregister_session_connection_handler(n); + n--; + delete sess; + //sess=new MySQL_Session(); + //mysql_sessions_connections_handler->pdata[n]=sess; + + } else { + sess->to_process=0; + } } } } @@ -1007,6 +1054,12 @@ void Standard_MySQL_Thread::register_session_connection_handler(MySQL_Session *_ proxy_debug(PROXY_DEBUG_NET,1,"Thread=%p, Session=%p -- Registered new session for connection handler\n", _sess->thread, _sess); }; +void Standard_MySQL_Thread::unregister_session_connection_handler(int idx) { + if (mysql_sessions_connections_handler==NULL) return; + proxy_debug(PROXY_DEBUG_NET,1,"Thread=%p, Session=%p -- Unregistered session\n", this, mysql_sessions_connections_handler->index(idx)); + mysql_sessions_connections_handler->remove_index_fast(idx); +}; + void Standard_MySQL_Thread::myds_backend_set_failed_connect(MySQL_Data_Stream *myds, unsigned int n) { if (curtime>mypolls.last_recv[n]+10000000) { diff --git a/lib/mysql_data_stream.cpp b/lib/mysql_data_stream.cpp index a0195e7a9..67431480d 100644 --- a/lib/mysql_data_stream.cpp +++ b/lib/mysql_data_stream.cpp @@ -95,6 +95,7 @@ MySQL_Data_Stream::MySQL_Data_Stream() { pkts_recv=0; pkts_sent=0; + timeout=0; connect_tries=0; poll_fds_idx=-1; resultset_length=0;