summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2015-12-04 18:16:04 +0100
committerVladislav Vaintroub <wlad@mariadb.com>2015-12-04 18:16:04 +0100
commit50160216eab066de7a71dd8e355f0c5cb29c8789 (patch)
tree1fa9274cc7cbb63b6f275bbcc3c849828437e4f5
parentba8e630d97af2b2ed3e527070f1cab05571911fd (diff)
downloadmariadb-git-50160216eab066de7a71dd8e355f0c5cb29c8789.tar.gz
MDEV-9156 : Fix tp_add_connection()'s error handling
Avoid possible my_thread_end() in the main polling thread.
-rw-r--r--sql/threadpool.h1
-rw-r--r--sql/threadpool_common.cc24
-rw-r--r--sql/threadpool_unix.cc2
-rw-r--r--sql/threadpool_win.cc4
4 files changed, 19 insertions, 12 deletions
diff --git a/sql/threadpool.h b/sql/threadpool.h
index c080e5ba343..bcbdca47808 100644
--- a/sql/threadpool.h
+++ b/sql/threadpool.h
@@ -27,6 +27,7 @@ extern uint threadpool_oversubscribe; /* Maximum active threads in group */
/* Common thread pool routines, suitable for different implementations */
+extern void threadpool_cleanup_connection(THD *thd);
extern void threadpool_remove_connection(THD *thd);
extern int threadpool_process_request(THD *thd);
extern int threadpool_add_connection(THD *thd);
diff --git a/sql/threadpool_common.cc b/sql/threadpool_common.cc
index 9e0cb07b86c..5bcea767aae 100644
--- a/sql/threadpool_common.cc
+++ b/sql/threadpool_common.cc
@@ -168,22 +168,28 @@ int threadpool_add_connection(THD *thd)
return retval;
}
+/*
+ threadpool_cleanup_connection() does the bulk of connection shutdown work.
+ Usually called from threadpool_remove_connection(), but rarely it might
+ be called also in the main polling thread if connection initialization fails.
+*/
+void threadpool_cleanup_connection(THD *thd)
+{
+ thd->net.reading_or_writing = 0;
+ end_connection(thd);
+ close_connection(thd, 0);
+ unlink_thd(thd);
+ mysql_cond_broadcast(&COND_thread_count);
+}
+
void threadpool_remove_connection(THD *thd)
{
-
Worker_thread_context worker_context;
worker_context.save();
-
thread_attach(thd);
- thd->net.reading_or_writing= 0;
-
- end_connection(thd);
- close_connection(thd, 0);
-
- unlink_thd(thd);
- mysql_cond_broadcast(&COND_thread_count);
+ threadpool_cleanup_connection(thd);
/*
Free resources associated with this connection:
mysys thread_var and PSI thread.
diff --git a/sql/threadpool_unix.cc b/sql/threadpool_unix.cc
index e720e43498a..89a2036cb10 100644
--- a/sql/threadpool_unix.cc
+++ b/sql/threadpool_unix.cc
@@ -1255,7 +1255,7 @@ void tp_add_connection(THD *thd)
else
{
/* Allocation failed */
- threadpool_remove_connection(thd);
+ threadpool_cleanup_connection(thd);
}
DBUG_VOID_RETURN;
}
diff --git a/sql/threadpool_win.cc b/sql/threadpool_win.cc
index 9cef1af272c..4be51f3d6e9 100644
--- a/sql/threadpool_win.cc
+++ b/sql/threadpool_win.cc
@@ -667,7 +667,7 @@ void tp_add_connection(THD *thd)
if(!con)
{
tp_log_warning("Allocation failed", "tp_add_connection");
- threadpool_remove_connection(thd);
+ threadpool_cleanup_connection(thd);
return;
}
@@ -685,7 +685,7 @@ void tp_add_connection(THD *thd)
else
{
/* Likely memory pressure */
- login_callback(NULL, con, NULL); /* deletes connection if something goes wrong */
+ threadpool_cleanup_connection(thd);
}
}