Allow admin module to wake up MySQL Threads #253

pull/254/head
René Cannaò 11 years ago
parent 5dd56963cc
commit 90ea9ea406

@ -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();

@ -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;i<num_threads;i++) {
Standard_MySQL_Thread *thr=(Standard_MySQL_Thread *)mysql_threads[i].worker;
int fd=thr->pipefd[1];
write(fd,&c,1);
}
}
extern "C" MySQL_Threads_Handler * create_MySQL_Threads_Handler_func() {
return new Standard_MySQL_Threads_Handler();
}

@ -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
}

Loading…
Cancel
Save