Skip to content

Commit 7bca7c5

Browse files
committed
MDEV-39184 Rework MDL enum constants and hash behavior.
Introduce NOT_INITIALIZED=0 in enum_mdl_namespace. Adjust all dependent structures accordingly. Shifting enum values changes the result of hash_value(). Since MDL locks are stored in a Split-Ordered List (lock-free hash table) ordered by my_reverse_bits(hash_value()), this alters the iteration order observed in metadata_lock_info. Updated the result files to reflect the new iteration order, as it is an implementation detail and does not affect MDL correctness.
1 parent 82ba33a commit 7bca7c5

File tree

8 files changed

+13
-13
lines changed

8 files changed

+13
-13
lines changed

mysql-test/main/backup_lock.result

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
5151
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
5252
MDL_BACKUP_DDL Backup lock
5353
MDL_BACKUP_FLUSH Backup lock
54+
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
5455
MDL_SHARED_WRITE Table metadata lock test t1
5556
MDL_SHARED_UPGRADABLE Table metadata lock test t1
56-
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
5757
SET STATEMENT max_statement_time=1 FOR backup stage block_ddl;
5858
ERROR 70100: Query was interrupted: execution time limit 1.0 sec exceeded
5959
backup stage block_ddl;
@@ -88,9 +88,9 @@ WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
8888
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
8989
MDL_BACKUP_ALTER_COPY Backup lock
9090
MDL_BACKUP_FLUSH Backup lock
91+
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
9192
MDL_SHARED_WRITE Table metadata lock test t1
9293
MDL_SHARED_UPGRADABLE Table metadata lock test t1
93-
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
9494
backup stage block_ddl;
9595
backup stage block_commit;
9696
connection default;
@@ -124,8 +124,8 @@ SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.me
124124
WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
125125
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
126126
MDL_BACKUP_WAIT_DDL Backup lock
127-
MDL_SHARED_WRITE Table metadata lock test t1
128127
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
128+
MDL_SHARED_WRITE Table metadata lock test t1
129129
backup stage end;
130130
connection default;
131131
commit;

mysql-test/main/backup_locks.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ drop table t1;
3434
connection default;
3535
SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%";
3636
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
37-
MDL_SHARED_HIGH_PRIO Table metadata lock test t1
3837
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
38+
MDL_SHARED_HIGH_PRIO Table metadata lock test t1
3939
select * from t1;
4040
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
4141
backup unlock;

mysql-test/main/mdl.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.me
4747
WHERE TABLE_NAME NOT LIKE 'innodb_%_stats';
4848
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
4949
MDL_BACKUP_DDL Backup lock
50+
MDL_SHARED_NO_READ_WRITE Table metadata lock mysql global_priv
51+
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
5052
MDL_SHARED_NO_READ_WRITE Table metadata lock mysql user
5153
MDL_SHARED_NO_READ_WRITE Table metadata lock test t1
5254
MDL_INTENTION_EXCLUSIVE Schema metadata lock mysql
53-
MDL_SHARED_NO_READ_WRITE Table metadata lock mysql global_priv
54-
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
5555
UNLOCK TABLES;
5656
LOCK TABLES mysql.general_log WRITE;
5757
ERROR HY000: You can't use locks with log tables

mysql-test/main/mdl_sync.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,9 +2405,9 @@ InnoDB 0 transactions not purged
24052405
SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info;
24062406
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
24072407
MDL_BACKUP_DDL Backup lock
2408-
MDL_EXCLUSIVE Stored procedure metadata lock test p1
2409-
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
24102408
MDL_SHARED_WRITE Table metadata lock mysql proc
2409+
MDL_INTENTION_EXCLUSIVE Schema metadata lock test
2410+
MDL_EXCLUSIVE Stored procedure metadata lock test p1
24112411
SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL grlwait';
24122412
FLUSH TABLES WITH READ LOCK;
24132413
connection default;

plugin/metadata_lock_info/metadata_lock_info.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "sql_i_s.h"
2222

2323
static const LEX_STRING metadata_lock_info_lock_name[] = {
24+
{ C_STRING_WITH_LEN("Not initialised") },
2425
{ C_STRING_WITH_LEN("Backup lock") },
2526
{ C_STRING_WITH_LEN("Schema metadata lock") },
2627
{ C_STRING_WITH_LEN("Table metadata lock") },

sql/mdl.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ static void init_mdl_psi_keys(void)
100100

101101
PSI_stage_info MDL_key::m_namespace_to_wait_state_name[NAMESPACE_END]=
102102
{
103+
{0, "Not initialised", 0},
103104
{0, "Waiting for backup lock", 0},
104105
{0, "Waiting for schema metadata lock", 0},
105106
{0, "Waiting for table metadata lock", 0},

sql/mdl.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,9 @@ struct MDL_key
394394
Note that although there isn't metadata locking on triggers,
395395
it's necessary to have a separate namespace for them since
396396
MDL_key is also used outside of the MDL subsystem.
397-
398-
TODO (newbie): NOT_INITIALIZED=0 as default bzero() sets wrongly type to
399-
BACKUP. But dozens switch() cases for NOT_INITIALIZED must be added to
400-
pacify the compiler.
401397
*/
402-
enum enum_mdl_namespace { BACKUP=0,
398+
enum enum_mdl_namespace { NOT_INITIALIZED=0,
399+
BACKUP,
403400
SCHEMA,
404401
TABLE,
405402
FUNCTION,

sql/sp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ inline const Sp_handler *Sp_handler::handler(MDL_key::enum_mdl_namespace type)
565565
return &sp_handler_procedure;
566566
case MDL_key::PACKAGE_BODY:
567567
return &sp_handler_package_body;
568+
case MDL_key::NOT_INITIALIZED:
568569
case MDL_key::BACKUP:
569570
case MDL_key::SCHEMA:
570571
case MDL_key::TABLE:

0 commit comments

Comments
 (0)