diff --git a/sql/mysqld.h b/sql/mysqld.h index e581b413e0d..f500a0abf3f 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -438,7 +438,7 @@ extern my_atomic_rwlock_t global_query_id_lock; void unireg_end(void) __attribute__((noreturn)); /* increment query_id and return it. */ -inline query_id_t next_query_id() +inline __attribute__((warn_unused_result)) query_id_t next_query_id() { query_id_t id; my_atomic_rwlock_wrlock(&global_query_id_lock); @@ -447,16 +447,6 @@ inline query_id_t next_query_id() return (id+1); } -inline query_id_t get_query_id() -{ - query_id_t id; - my_atomic_rwlock_wrlock(&global_query_id_lock); - id= my_atomic_load64(&global_query_id); - my_atomic_rwlock_wrunlock(&global_query_id_lock); - return id; -} - - /* TODO: Replace this with an inline function. */ diff --git a/sql/sql_class.h b/sql/sql_class.h index 7211eca4939..58328713e77 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3667,7 +3667,9 @@ public: /** Skip the increase of the global query id counter. Commonly set for commands that are stateless (won't cause any change on the server - internal states). + internal states). This is made obsolete as query id is incremented for + ping and statistics commands as well because of race condition + (Bug#58785). */ #define CF_SKIP_QUERY_ID (1U << 0) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 6e2b422bd44..fe9f564672a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -237,8 +237,8 @@ void init_update_queries(void) /* Initialize the server command flags array. */ memset(server_command_flags, 0, sizeof(server_command_flags)); - server_command_flags[COM_STATISTICS]= CF_SKIP_QUERY_ID | CF_SKIP_QUESTIONS; - server_command_flags[COM_PING]= CF_SKIP_QUERY_ID | CF_SKIP_QUESTIONS; + server_command_flags[COM_STATISTICS]= CF_SKIP_QUESTIONS; + server_command_flags[COM_PING]= CF_SKIP_QUESTIONS; server_command_flags[COM_STMT_PREPARE]= CF_SKIP_QUESTIONS; server_command_flags[COM_STMT_CLOSE]= CF_SKIP_QUESTIONS; server_command_flags[COM_STMT_RESET]= CF_SKIP_QUESTIONS; @@ -901,9 +901,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->security_ctx->master_access|= SHUTDOWN_ACL; command= COM_SHUTDOWN; } - thd->set_query_id(get_query_id()); - if (!(server_command_flags[command] & CF_SKIP_QUERY_ID)) - next_query_id(); + thd->set_query_id(next_query_id()); inc_thread_running(); if (!(server_command_flags[command] & CF_SKIP_QUESTIONS))