From 90ea9ea406f613de8af4182e6d981d2d5178e547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Fri, 17 Apr 2015 03:59:28 +0000 Subject: [PATCH] Allow admin module to wake up MySQL Threads #253 --- include/mysql_thread.h | 9 +++++++-- lib/Standard_MySQL_Thread.cpp | 23 ++++++++++++++++++++++- lib/Standard_ProxySQL_Admin.cpp | 12 ++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/include/mysql_thread.h b/include/mysql_thread.h index d260f9896..35d74f8c0 100644 --- a/include/mysql_thread.h +++ b/include/mysql_thread.h @@ -177,12 +177,14 @@ class ProxySQL_Poll { if (len==size) { expand(1); } - _myds->mypolls=this; myds[len]=_myds; fds[len].fd=_fd; fds[len].events=_events; fds[len].revents=0; - _myds->poll_fds_idx=len; // fix a serious bug + if (_myds) { + _myds->mypolls=this; + _myds->poll_fds_idx=len; // fix a serious bug + } last_recv[len]=monotonic_time(); last_sent[len]=sent_time; len++; @@ -230,6 +232,7 @@ class MySQL_Thread public: + int pipefd[2]; unsigned long long curtime; ProxySQL_Poll mypolls; @@ -318,6 +321,7 @@ class MySQL_Threads_Handler virtual int listener_del(const char *iface) {return -1;} virtual int listener_del(const char *address, int port) {return -1;} virtual void start_listeners() {}; + virtual void signal_all_threads() {}; }; class Standard_MySQL_Threads_Handler: public MySQL_Threads_Handler @@ -371,6 +375,7 @@ class Standard_MySQL_Threads_Handler: public MySQL_Threads_Handler virtual int listener_add(const char *address, int port); virtual int listener_del(const char *iface); virtual void start_listeners(); + virtual void signal_all_threads(); // virtual int listener_del(const char *address, int port); // pthread_t connection_manager_thread_id; // void connection_manager_thread(); diff --git a/lib/Standard_MySQL_Thread.cpp b/lib/Standard_MySQL_Thread.cpp index 5681ac56e..a98b278a2 100644 --- a/lib/Standard_MySQL_Thread.cpp +++ b/lib/Standard_MySQL_Thread.cpp @@ -653,6 +653,9 @@ bool Standard_MySQL_Thread::init() { memset(my_idle_myds,0,sizeof(MySQL_Data_Stream *)*SESSIONS_FOR_CONNECTIONS_HANDLER); GloQPro->init_thread(); refresh_variables(); + i=pipe(pipefd); + mypolls.add(POLLIN, pipefd[0], NULL, 0); + assert(i==0); return true; } @@ -767,7 +770,7 @@ void Standard_MySQL_Thread::run() { for (n = 0; n < mypolls.len; n++) { mypolls.fds[n].revents=0; - if (mypolls.myds[n]->myds_type!=MYDS_LISTENER && mypolls.myds[n]->myds_type!=MYDS_BACKEND_PAUSE_CONNECT) { + if (mypolls.myds[n] && mypolls.myds[n]->myds_type!=MYDS_LISTENER && mypolls.myds[n]->myds_type!=MYDS_BACKEND_PAUSE_CONNECT) { mypolls.myds[n]->set_pollout(); } } @@ -831,6 +834,14 @@ void Standard_MySQL_Thread::run() { MySQL_Data_Stream *myds=mypolls.myds[n]; + if (myds==NULL) { + if (mypolls.fds[n].revents) { + char c; + read(mypolls.fds[n].fd, &c, 1); // read just one byte , no need for error handling + fprintf(stderr,"Got signal from admin , done nothing\n"); // FIXME: this is just the scheleton for issue #253 + } + continue; + } if (mypolls.fds[n].revents==0) { switch(myds->myds_type) { @@ -1208,6 +1219,16 @@ SQLite3_result * Standard_MySQL_Threads_Handler::SQL3_Threads_status(MySQL_Sessi return result; } +void Standard_MySQL_Threads_Handler::signal_all_threads() { + unsigned int i; + char c; + for (i=0;ipipefd[1]; + write(fd,&c,1); + } +} + extern "C" MySQL_Threads_Handler * create_MySQL_Threads_Handler_func() { return new Standard_MySQL_Threads_Handler(); } diff --git a/lib/Standard_ProxySQL_Admin.cpp b/lib/Standard_ProxySQL_Admin.cpp index afcdfb5d8..7c69b2941 100644 --- a/lib/Standard_ProxySQL_Admin.cpp +++ b/lib/Standard_ProxySQL_Admin.cpp @@ -975,6 +975,18 @@ void admin_session_handler(MySQL_Session *sess, ProxySQL_Admin *pa, PtrSize_t *p } } + // FIXME: this should be removed, it is just a POC for issue #253 . What is important is the call to GloMTH->signal_all_threads(); + if (!strncasecmp("SIGNAL MYSQL THREADS", query_no_space, strlen("SIGNAL MYSQL THREADS"))) { + GloMTH->signal_all_threads(); + proxy_debug(PROXY_DEBUG_ADMIN, 4, "Received %s command\n", query_no_space); + Standard_ProxySQL_Admin *SPA=(Standard_ProxySQL_Admin *)pa; + SPA->save_admin_variables_from_runtime(); + proxy_debug(PROXY_DEBUG_ADMIN, 4, "Sent signal to all mysql threads\n"); + SPA->send_MySQL_OK(&sess->client_myds->myprot, NULL); + run_query=false; + goto __run_query; + } + if (strncasecmp("SHOW ", query_no_space, 5)) { goto __end_show_commands; // in the next block there are only SHOW commands }