Commit 66f4900b authored by Sergei Golubchik's avatar Sergei Golubchik

Revert "MDEV-23536 : Race condition between KILL and transaction commit"

This reverts the server part of the commit 775fccea
but keeps InnoDB part (which reverted MDEV-17092 5530a93f).

So after this both MDEV-23536 and MDEV-17092 are reverted,
and the original bug is resurrected.
parent fdc4b7a6
...@@ -1357,14 +1357,11 @@ void THD::change_user(void) ...@@ -1357,14 +1357,11 @@ void THD::change_user(void)
/* Do operations that may take a long time */ /* Do operations that may take a long time */
void THD::cleanup(bool have_mutex) void THD::cleanup(void)
{ {
DBUG_ENTER("THD::cleanup"); DBUG_ENTER("THD::cleanup");
DBUG_ASSERT(cleanup_done == 0); DBUG_ASSERT(cleanup_done == 0);
if (have_mutex)
set_killed_no_mutex(KILL_CONNECTION,0,0);
else
set_killed(KILL_CONNECTION); set_killed(KILL_CONNECTION);
#ifdef ENABLE_WHEN_BINLOG_WILL_BE_ABLE_TO_PREPARE #ifdef ENABLE_WHEN_BINLOG_WILL_BE_ABLE_TO_PREPARE
if (transaction.xid_state.xa_state == XA_PREPARED) if (transaction.xid_state.xa_state == XA_PREPARED)
...@@ -1440,28 +1437,6 @@ void THD::cleanup(bool have_mutex) ...@@ -1440,28 +1437,6 @@ void THD::cleanup(bool have_mutex)
void THD::free_connection() void THD::free_connection()
{ {
DBUG_ASSERT(free_connection_done == 0); DBUG_ASSERT(free_connection_done == 0);
/* Check that we have already called thd->unlink() */
DBUG_ASSERT(prev == 0 && next == 0);
/*
Other threads may have a lock on THD::LOCK_thd_data or
THD::LOCK_thd_kill to ensure that this THD is not deleted
while they access it. The following mutex_lock ensures
that no one else is using this THD and it's now safe to
continue.
For example consider KILL-statement execution on
sql_parse.cc kill_one_thread() that will use
THD::LOCK_thd_data to protect victim thread during
THD::awake().
*/
mysql_mutex_lock(&LOCK_thd_data);
mysql_mutex_lock(&LOCK_thd_kill);
#ifdef WITH_WSREP
delete wsrep_rgi;
wsrep_rgi= 0;
#endif /* WITH_WSREP */
my_free(db); my_free(db);
db= NULL; db= NULL;
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
...@@ -1471,7 +1446,7 @@ void THD::free_connection() ...@@ -1471,7 +1446,7 @@ void THD::free_connection()
net_end(&net); net_end(&net);
#endif #endif
if (!cleanup_done) if (!cleanup_done)
cleanup(true); // We have locked THD::LOCK_thd_kill cleanup();
ha_close_connection(this); ha_close_connection(this);
plugin_thdvar_cleanup(this); plugin_thdvar_cleanup(this);
mysql_audit_free_thd(this); mysql_audit_free_thd(this);
...@@ -1482,8 +1457,6 @@ void THD::free_connection() ...@@ -1482,8 +1457,6 @@ void THD::free_connection()
#if defined(ENABLED_PROFILING) #if defined(ENABLED_PROFILING)
profiling.restart(); // Reset profiling profiling.restart(); // Reset profiling
#endif #endif
mysql_mutex_unlock(&LOCK_thd_kill);
mysql_mutex_unlock(&LOCK_thd_data);
} }
/* /*
...@@ -1539,6 +1512,9 @@ THD::~THD() ...@@ -1539,6 +1512,9 @@ THD::~THD()
mysql_mutex_lock(&LOCK_thd_data); mysql_mutex_lock(&LOCK_thd_data);
mysql_mutex_unlock(&LOCK_thd_data); mysql_mutex_unlock(&LOCK_thd_data);
#ifdef WITH_WSREP
delete wsrep_rgi;
#endif
if (!free_connection_done) if (!free_connection_done)
free_connection(); free_connection();
......
...@@ -3194,7 +3194,7 @@ class THD :public Statement, ...@@ -3194,7 +3194,7 @@ class THD :public Statement,
void update_all_stats(); void update_all_stats();
void update_stats(void); void update_stats(void);
void change_user(void); void change_user(void);
void cleanup(bool have_mutex=false); void cleanup(void);
void cleanup_after_query(); void cleanup_after_query();
void free_connection(); void free_connection();
void reset_for_reuse(); void reset_for_reuse();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment