mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Bug#17083851 BACKPORT BUG#11765744 TO 5.1, 5.5 AND 5.6
Description:
Original fix Bug#11765744 changed mutex to read write lock
to avoid multiple recursive lock acquire operation on
LOCK_status mutex.
On Windows, locking read-write lock recursively is not safe.
Slim read-write locks, which MySQL uses if they are supported by
Windows version, do not support recursion according to their
documentation. For our own implementation of read-write lock,
which is used in cases when Windows version doesn't support SRW,
recursive locking of read-write lock can easily lead to deadlock
if there are concurrent lock requests.
Fix:
This patch reverts the previous fix for bug#11765744 that used
read-write locks. Instead problem of recursive locking for
LOCK_status mutex is solved by tracking recursion level using
counter in THD object and acquiring lock only once when we enter
fill_status() function first time.
This commit is contained in:
@@ -1586,6 +1586,16 @@ public:
|
||||
/* <> 0 if we are inside of trigger or stored function. */
|
||||
uint in_sub_stmt;
|
||||
|
||||
/**
|
||||
Used by fill_status() to avoid acquiring LOCK_status mutex twice
|
||||
when this function is called recursively (e.g. queries
|
||||
that contains SELECT on I_S.GLOBAL_STATUS with subquery on the
|
||||
same I_S table).
|
||||
Incremented each time fill_status() function is entered and
|
||||
decremented each time before it returns from the function.
|
||||
*/
|
||||
uint fill_status_recursion_level;
|
||||
|
||||
/* container for handler's private per-connection data */
|
||||
Ha_data ha_data[MAX_HA];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user