Skip to content

Commit eea7448

Browse files
committed
MDEV-39184 Rework MDL enum constants and hash behavior
Introduce MDL_NOT_INITIALIZED=0 in enum_mdl_type and NOT_INITIALIZED=0 in enum_mdl_namespace. Adjust all dependent structures accordingly and shift MDL_BACKUP_* enum values by +1. 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. Remove the previous workaround that preserved old hash values by adjusting enums during hashing. Instead, update result files to reflect the new iteration order, as it is an implementation detail and does not affect MDL correctness.
1 parent 82ba33a commit eea7448

File tree

8 files changed

+38
-35
lines changed

8 files changed

+38
-35
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: 9 additions & 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},
@@ -114,6 +115,7 @@ PSI_stage_info MDL_key::m_namespace_to_wait_state_name[NAMESPACE_END]=
114115

115116
static const LEX_STRING lock_types[]=
116117
{
118+
{ C_STRING_WITH_LEN("MDL_NOT_INITIALIZED") },
117119
{ C_STRING_WITH_LEN("MDL_INTENTION_EXCLUSIVE") },
118120
{ C_STRING_WITH_LEN("MDL_SHARED") },
119121
{ C_STRING_WITH_LEN("MDL_SHARED_HIGH_PRIO") },
@@ -129,6 +131,7 @@ static const LEX_STRING lock_types[]=
129131

130132
static const LEX_STRING backup_lock_types[]=
131133
{
134+
{ C_STRING_WITH_LEN("MDL_BACKUP_NOT_INITIALIZED") },
132135
{ C_STRING_WITH_LEN("MDL_BACKUP_START") },
133136
{ C_STRING_WITH_LEN("MDL_BACKUP_FLUSH") },
134137
{ C_STRING_WITH_LEN("MDL_BACKUP_WAIT_FLUSH") },
@@ -2154,6 +2157,7 @@ void MDL_lock::reschedule_waiters()
21542157
const MDL_lock::bitmap_t
21552158
MDL_lock::MDL_scoped_lock::m_granted_incompatible[MDL_TYPE_END]=
21562159
{
2160+
0,
21572161
MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_SHARED),
21582162
MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_INTENTION_EXCLUSIVE),
21592163
0, 0, 0, 0, 0, 0, 0,
@@ -2163,6 +2167,7 @@ MDL_lock::MDL_scoped_lock::m_granted_incompatible[MDL_TYPE_END]=
21632167
const MDL_lock::bitmap_t
21642168
MDL_lock::MDL_scoped_lock::m_waiting_incompatible[MDL_TYPE_END]=
21652169
{
2170+
0,
21662171
MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_SHARED),
21672172
MDL_BIT(MDL_EXCLUSIVE), 0, 0, 0, 0, 0, 0, 0, 0
21682173
};
@@ -2227,6 +2232,7 @@ MDL_lock::MDL_scoped_lock::m_waiting_incompatible[MDL_TYPE_END]=
22272232
const MDL_lock::bitmap_t
22282233
MDL_lock::MDL_object_lock::m_granted_incompatible[MDL_TYPE_END]=
22292234
{
2235+
0,
22302236
0,
22312237
MDL_BIT(MDL_EXCLUSIVE),
22322238
MDL_BIT(MDL_EXCLUSIVE),
@@ -2255,6 +2261,7 @@ MDL_lock::MDL_object_lock::m_granted_incompatible[MDL_TYPE_END]=
22552261
const MDL_lock::bitmap_t
22562262
MDL_lock::MDL_object_lock::m_waiting_incompatible[MDL_TYPE_END]=
22572263
{
2264+
0,
22582265
0,
22592266
MDL_BIT(MDL_EXCLUSIVE),
22602267
0,
@@ -2330,6 +2337,7 @@ MDL_lock::MDL_object_lock::m_waiting_incompatible[MDL_TYPE_END]=
23302337
const MDL_lock::bitmap_t
23312338
MDL_lock::MDL_backup_lock::m_granted_incompatible[MDL_BACKUP_END]=
23322339
{
2340+
0,
23332341
/* MDL_BACKUP_START */
23342342
MDL_BIT(MDL_BACKUP_START) | MDL_BIT(MDL_BACKUP_FLUSH) | MDL_BIT(MDL_BACKUP_WAIT_FLUSH) | MDL_BIT(MDL_BACKUP_WAIT_DDL) | MDL_BIT(MDL_BACKUP_WAIT_COMMIT) | MDL_BIT(MDL_BACKUP_BLOCK_DDL),
23352343
MDL_BIT(MDL_BACKUP_START),
@@ -2357,6 +2365,7 @@ MDL_lock::MDL_backup_lock::m_granted_incompatible[MDL_BACKUP_END]=
23572365
const MDL_lock::bitmap_t
23582366
MDL_lock::MDL_backup_lock::m_waiting_incompatible[MDL_BACKUP_END]=
23592367
{
2368+
0,
23602369
/* MDL_BACKUP_START */
23612370
MDL_BIT(MDL_BACKUP_FLUSH) | MDL_BIT(MDL_BACKUP_WAIT_FLUSH) | MDL_BIT(MDL_BACKUP_WAIT_DDL) | MDL_BIT(MDL_BACKUP_WAIT_COMMIT) | MDL_BIT(MDL_BACKUP_BLOCK_DDL),
23622371
0,

sql/mdl.h

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,7 @@ class MDL_context_owner
133133

134134
enum enum_mdl_type {
135135
/* This means that the MDL_request is not initialized */
136-
/*
137-
TODO (newbie): should be MDL_NOT_INITIALIZED= 0, as it is strange
138-
that not-inited request has MDL_INTENTION_EXCLUSIVE.
139-
Must fix tests, as at least mysql_rm_table_no_locks() depends on this.
140-
*/
141-
MDL_NOT_INITIALIZED= -1,
136+
MDL_NOT_INITIALIZED= 0,
142137
/*
143138
An intention exclusive metadata lock (IX). Used only for scoped locks.
144139
Owner of this type of lock can acquire upgradable exclusive locks on
@@ -149,7 +144,7 @@ enum enum_mdl_type {
149144
object metadata. Object may refer table, stored procedure, trigger,
150145
view/etc.
151146
*/
152-
MDL_INTENTION_EXCLUSIVE= 0,
147+
MDL_INTENTION_EXCLUSIVE,
153148
/*
154149
A shared metadata lock (S).
155150
To be used in cases when we are interested in object metadata only
@@ -273,51 +268,51 @@ enum enum_mdl_type {
273268
/**
274269
Block concurrent backup
275270
*/
276-
#define MDL_BACKUP_START enum_mdl_type(0)
271+
#define MDL_BACKUP_START enum_mdl_type(1)
277272
/**
278273
Block new write requests to non transactional tables
279274
*/
280-
#define MDL_BACKUP_FLUSH enum_mdl_type(1)
275+
#define MDL_BACKUP_FLUSH enum_mdl_type(2)
281276
/**
282277
In addition to previous locks, blocks running requests to non trans tables
283278
Used to wait until all DML usage of on trans tables are finished
284279
*/
285-
#define MDL_BACKUP_WAIT_FLUSH enum_mdl_type(2)
280+
#define MDL_BACKUP_WAIT_FLUSH enum_mdl_type(3)
286281
/**
287282
In addition to previous locks, blocks new DDL's from starting
288283
*/
289-
#define MDL_BACKUP_WAIT_DDL enum_mdl_type(3)
284+
#define MDL_BACKUP_WAIT_DDL enum_mdl_type(4)
290285
/**
291286
In addition to previous locks, blocks commits
292287
*/
293-
#define MDL_BACKUP_WAIT_COMMIT enum_mdl_type(4)
288+
#define MDL_BACKUP_WAIT_COMMIT enum_mdl_type(5)
294289

295290
/**
296291
Blocks (or is blocked by) statements that intend to modify data. Acquired
297292
before commit lock by FLUSH TABLES WITH READ LOCK.
298293
*/
299-
#define MDL_BACKUP_FTWRL1 enum_mdl_type(5)
294+
#define MDL_BACKUP_FTWRL1 enum_mdl_type(6)
300295

301296
/**
302297
Blocks (or is blocked by) commits. Acquired after global read lock by
303298
FLUSH TABLES WITH READ LOCK.
304299
*/
305-
#define MDL_BACKUP_FTWRL2 enum_mdl_type(6)
300+
#define MDL_BACKUP_FTWRL2 enum_mdl_type(7)
306301

307-
#define MDL_BACKUP_DML enum_mdl_type(7)
308-
#define MDL_BACKUP_TRANS_DML enum_mdl_type(8)
309-
#define MDL_BACKUP_SYS_DML enum_mdl_type(9)
302+
#define MDL_BACKUP_DML enum_mdl_type(8)
303+
#define MDL_BACKUP_TRANS_DML enum_mdl_type(9)
304+
#define MDL_BACKUP_SYS_DML enum_mdl_type(10)
310305

311306
/**
312307
Must be acquired by DDL statements that intend to modify data.
313308
Currently it's also used for LOCK TABLES.
314309
*/
315-
#define MDL_BACKUP_DDL enum_mdl_type(10)
310+
#define MDL_BACKUP_DDL enum_mdl_type(11)
316311

317312
/**
318313
Blocks new DDL's. Used by backup code to enable DDL logging
319314
*/
320-
#define MDL_BACKUP_BLOCK_DDL enum_mdl_type(11)
315+
#define MDL_BACKUP_BLOCK_DDL enum_mdl_type(12)
321316

322317
/*
323318
Statement is modifying data, but will not block MDL_BACKUP_DDL or earlier
@@ -326,13 +321,13 @@ enum enum_mdl_type {
326321
MDL_BACKUP_ALTER_COPY while alter table is copying or modifying data.
327322
*/
328323

329-
#define MDL_BACKUP_ALTER_COPY enum_mdl_type(12)
324+
#define MDL_BACKUP_ALTER_COPY enum_mdl_type(13)
330325

331326
/**
332327
Must be acquired during commit.
333328
*/
334-
#define MDL_BACKUP_COMMIT enum_mdl_type(13)
335-
#define MDL_BACKUP_END enum_mdl_type(14)
329+
#define MDL_BACKUP_COMMIT enum_mdl_type(14)
330+
#define MDL_BACKUP_END enum_mdl_type(15)
336331

337332

338333
/** Duration of metadata lock. */
@@ -394,12 +389,9 @@ struct MDL_key
394389
Note that although there isn't metadata locking on triggers,
395390
it's necessary to have a separate namespace for them since
396391
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.
401392
*/
402-
enum enum_mdl_namespace { BACKUP=0,
393+
enum enum_mdl_namespace { NOT_INITIALIZED=0,
394+
BACKUP,
403395
SCHEMA,
404396
TABLE,
405397
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)