summaryrefslogtreecommitdiff
path: root/sql/sql_class.h
diff options
context:
space:
mode:
authorDavi Arnaut <davi.arnaut@oracle.com>2010-12-15 20:59:21 -0200
committerDavi Arnaut <davi.arnaut@oracle.com>2010-12-15 20:59:21 -0200
commit4e2cf44180cac803013d086bd50fe06ab3d863a5 (patch)
tree40ac241a8b0dc4aaa69489f0e28b7b759da0511f /sql/sql_class.h
parent4ccb32c09aa0a4c9678e8cf499a552259c19d743 (diff)
downloadmariadb-git-4e2cf44180cac803013d086bd50fe06ab3d863a5.tar.gz
Bug#58136: Crash in vio_close at concurrent disconnect and KILL
The problem is a race between a session closing its vio (i.e. after a COM_QUIT) at the same time it is being killed by another thread. This could trigger a assertion in vio_close() as the two threads could end up closing the same vio, at the same time. This could happen due to the implementation of SIGNAL_WITH_VIO_CLOSE, which closes the vio of the thread being killed. The solution is to serialize the close of the Vio under LOCK_thd_data, which protects THD data. No regression test is added as this is essentially a debug issue and the test case would be quite convoluted as we would need to synchronize a session that is being killed -- which is a bit difficult since debug sync points code does not synchronize killed sessions. sql/mysqld.cc: Drop lock parameter from close_connection, its not necessary any more. The newly introduced THD::disconnect method will take care of locking. sql/mysqld.h: Change prototype, add a default parameter for the error code. sql/sql_class.cc: In case SIGNAL_WITH_VIO_CLOSE is defined, the active vio is closed and cleared. Subsequent calls will only close the vio owned by the session.
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r--sql/sql_class.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index db20fd73b42..b8e7b685108 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -2209,6 +2209,9 @@ public:
#endif
void awake(THD::killed_state state_to_set);
+ /** Disconnect the associated communication endpoint. */
+ void disconnect();
+
#ifndef MYSQL_CLIENT
enum enum_binlog_query_type {
/* The query can be logged in row format or in statement format. */