summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2017-04-24 15:39:47 +0200
committerSergei Golubchik <serg@mariadb.org>2017-04-27 19:12:37 +0200
commit99e1294c1e2ddd0bbd81129f1c0902be31a38f48 (patch)
treea5ef2bbbef5e45d81d29eef6d3fe8ef85245f8b1
parent2c3f5787896f1278e240095c49539ad7baf77d8b (diff)
downloadmariadb-git-99e1294c1e2ddd0bbd81129f1c0902be31a38f48.tar.gz
bugfix: federated/replication did not increment bytes_received status variable
because mysql->net.thd was reset to NULL in mysql_real_connect() and thd_increment_bytes_received() didn't do anything. Fix: * set mysql->net.thd to current_thd instread. * remove the test for non-null THD from a very often used function thd_increment_bytes_received().
-rw-r--r--include/my_pthread.h20
-rw-r--r--sql-common/client.c2
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/mysqld.h14
-rw-r--r--sql/sql_class.cc14
5 files changed, 22 insertions, 30 deletions
diff --git a/include/my_pthread.h b/include/my_pthread.h
index 37576ac3cb4..6b830ca36d2 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -367,6 +367,26 @@ int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
} while(0)
#endif /* !set_timespec_time_nsec */
+#ifdef MYSQL_CLIENT
+#define _current_thd() NULL
+#elif defined(_WIN32)
+#ifdef __cplusplus
+extern "C"
+#endif
+MYSQL_THD _current_thd_noinline();
+#define _current_thd() _current_thd_noinline()
+#else
+/*
+ THR_THD is a key which will be used to set/get THD* for a thread,
+ using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr().
+*/
+extern pthread_key(MYSQL_THD, THR_THD);
+static inline MYSQL_THD _current_thd(void)
+{
+ return my_pthread_getspecific_ptr(MYSQL_THD,THR_THD);
+}
+#endif
+
/* safe_mutex adds checking to mutex for easier debugging */
struct st_hash;
typedef struct st_safe_mutex_t
diff --git a/sql-common/client.c b/sql-common/client.c
index 86c7dea5a58..42b6667b1bf 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -3408,7 +3408,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
if (mysql->options.extension && mysql->options.extension->async_context)
net->vio->async_context= mysql->options.extension->async_context;
- if (my_net_init(net, net->vio, 0, MYF(0)))
+ if (my_net_init(net, net->vio, _current_thd(), MYF(0)))
{
vio_delete(net->vio);
net->vio = 0;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 4f83e19f905..83829841b39 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -6187,7 +6187,7 @@ static void bootstrap(MYSQL_FILE *file)
thd->variables.wsrep_on= 0;
#endif
thd->bootstrap=1;
- my_net_init(&thd->net,(st_vio*) 0, (void*) 0, MYF(0));
+ my_net_init(&thd->net,(st_vio*) 0, thd, MYF(0));
thd->max_client_packet_length= thd->net.max_packet;
thd->security_ctx->master_access= ~(ulong)0;
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 0e21b0f020a..c9ce982ec6f 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -761,20 +761,6 @@ inline void dec_thread_running()
void set_server_version(void);
-#if defined(MYSQL_DYNAMIC_PLUGIN) && defined(_WIN32)
-extern "C" THD *_current_thd_noinline();
-#define _current_thd() _current_thd_noinline()
-#else
-/*
- THR_THD is a key which will be used to set/get THD* for a thread,
- using my_pthread_setspecific_ptr()/my_thread_getspecific_ptr().
-*/
-extern pthread_key(THD*, THR_THD);
-inline THD *_current_thd(void)
-{
- return my_pthread_getspecific_ptr(THD*,THR_THD);
-}
-#endif
#define current_thd _current_thd()
inline int set_current_thd(THD *thd)
{
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 5dba389115a..8ecf0511d06 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -370,16 +370,6 @@ void thd_close_connection(THD *thd)
}
/**
- Get current THD object from thread local data
-
- @retval The THD object for the thread, NULL if not connection thread
-*/
-THD *thd_get_current_thd()
-{
- return current_thd;
-}
-
-/**
Lock data that needs protection in THD object
@param thd THD object
@@ -4074,16 +4064,12 @@ my_bool thd_net_is_killed()
void thd_increment_bytes_received(void *thd, ulong length)
{
- if (unlikely(!thd)) // Called from federatedx
- thd= current_thd;
((THD*) thd)->status_var.bytes_received+= length;
}
void thd_increment_net_big_packet_count(void *thd, ulong length)
{
- if (unlikely(!thd)) // Called from federatedx
- thd= current_thd;
((THD*) thd)->status_var.net_big_packet_count+= length;
}