Skip to content

Commit

Permalink
Merge pull request #4757 from sysown/v2.7-fix_hang_on_resume
Browse files Browse the repository at this point in the history
Fix halt on 'PROXYSQL RESUME' command
  • Loading branch information
renecannao authored Nov 26, 2024
2 parents 77a911d + 321ffe0 commit 7c64542
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 15 deletions.
1 change: 0 additions & 1 deletion include/ProxySQL_Poll.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class ProxySQL_Poll {
MySQL_Data_Stream **myds;
unsigned long long *last_recv;
unsigned long long *last_sent;
std::atomic<bool> bootstrapping_listeners;
volatile int pending_listener_add;
volatile int pending_listener_del;
unsigned int poll_timeout;
Expand Down
22 changes: 10 additions & 12 deletions lib/MySQL_Thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1200,7 +1200,11 @@ int MySQL_Threads_Handler::listener_del(const char *iface) {
}
for (i=0;i<num_threads;i++) {
MySQL_Thread *thr=(MySQL_Thread *)mysql_threads[i].worker;
while(__sync_fetch_and_add(&thr->mypolls.pending_listener_del,0));
while(__sync_fetch_and_add(&thr->mypolls.pending_listener_del,0)) {
// Since 'listeners_stop' is performed in 'maintenance_loops' by the
// workers this active-wait is likely to take some time.
usleep(std::min(std::max(mysql_thread___poll_timeout/20, 10000), 40000));
}
}
MLM->del(idx);
#ifdef SO_REUSEPORT
Expand Down Expand Up @@ -3303,15 +3307,11 @@ void MySQL_Thread::run_BootstrapListener() {
if (n) {
poll_listener_add(n);
assert(__sync_bool_compare_and_swap(&mypolls.pending_listener_add,n,0));
} else {
if (GloMTH->bootstrapping_listeners == false) {
// we stop looping
mypolls.bootstrapping_listeners = false;
}
}
#ifdef DEBUG
usleep(5+rand()%10);
#endif
// The delay for the active-wait is a fraction of 'poll_timeout'. Since other
// threads may be waiting on poll for further operations, checks are meaningless
// until that timeout expires (other workers make progress).
usleep(std::min(std::max(mysql_thread___poll_timeout/20, 10000), 40000) + (rand() % 2000));
}
}

Expand Down Expand Up @@ -3432,9 +3432,7 @@ void MySQL_Thread::run() {
#endif // IDLE_THREADS

pthread_mutex_unlock(&thread_mutex);
if (unlikely(mypolls.bootstrapping_listeners == true)) {
run_BootstrapListener();
}
run_BootstrapListener();

// flush mysql log file
GloMyLogger->flush();
Expand Down
1 change: 0 additions & 1 deletion lib/ProxySQL_Poll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ ProxySQL_Poll::ProxySQL_Poll() {
len=0;
pending_listener_add=0;
pending_listener_del=0;
bootstrapping_listeners = true;
size=MIN_POLL_LEN;
fds=(struct pollfd *)malloc(size*sizeof(struct pollfd));
myds=(MySQL_Data_Stream **)malloc(size*sizeof(MySQL_Data_Stream *));
Expand Down
4 changes: 3 additions & 1 deletion test/tap/tests/reg_test_4402-mysql_fields-t.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,9 @@ int main(int argc, char** argv) {

// to check table alias issue:
{
const std::string& query = "SELECT data FROM testdb.dummy_table AS " + generate_random_string(length);
// NOTE: The randomly generated string should be escaped \`\`, otherwise could collide
// with SQL reserved words, causing an invalid test failure.
const std::string& query = "SELECT data FROM testdb.dummy_table AS `" + generate_random_string(length) + "`";
MYSQL_QUERY__(proxysql, query.c_str());

MYSQL_RES* res = mysql_use_result(proxysql);
Expand Down

0 comments on commit 7c64542

Please sign in to comment.