From 657a9d4c96c2f9afef540515f4f7f78141b9d915 Mon Sep 17 00:00:00 2001 From: PranavKTiwari Date: Tue, 7 Apr 2026 14:41:17 +0530 Subject: [PATCH 1/2] MDEV-39184-Rework MDL enum constants values --- sql/mdl.cc | 8 ++++++++ sql/mdl.h | 36 ++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/sql/mdl.cc b/sql/mdl.cc index 944d4cd4d4300..16bf85e0a61ca 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -114,6 +114,7 @@ PSI_stage_info MDL_key::m_namespace_to_wait_state_name[NAMESPACE_END]= static const LEX_STRING lock_types[]= { + {}, { C_STRING_WITH_LEN("MDL_INTENTION_EXCLUSIVE") }, { C_STRING_WITH_LEN("MDL_SHARED") }, { C_STRING_WITH_LEN("MDL_SHARED_HIGH_PRIO") }, @@ -129,6 +130,7 @@ static const LEX_STRING lock_types[]= static const LEX_STRING backup_lock_types[]= { + {}, { C_STRING_WITH_LEN("MDL_BACKUP_START") }, { C_STRING_WITH_LEN("MDL_BACKUP_FLUSH") }, { C_STRING_WITH_LEN("MDL_BACKUP_WAIT_FLUSH") }, @@ -2154,6 +2156,7 @@ void MDL_lock::reschedule_waiters() const MDL_lock::bitmap_t MDL_lock::MDL_scoped_lock::m_granted_incompatible[MDL_TYPE_END]= { + 0, MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_SHARED), MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_INTENTION_EXCLUSIVE), 0, 0, 0, 0, 0, 0, 0, @@ -2163,6 +2166,7 @@ MDL_lock::MDL_scoped_lock::m_granted_incompatible[MDL_TYPE_END]= const MDL_lock::bitmap_t MDL_lock::MDL_scoped_lock::m_waiting_incompatible[MDL_TYPE_END]= { + 0, MDL_BIT(MDL_EXCLUSIVE) | MDL_BIT(MDL_SHARED), MDL_BIT(MDL_EXCLUSIVE), 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -2227,6 +2231,7 @@ MDL_lock::MDL_scoped_lock::m_waiting_incompatible[MDL_TYPE_END]= const MDL_lock::bitmap_t MDL_lock::MDL_object_lock::m_granted_incompatible[MDL_TYPE_END]= { + 0, 0, MDL_BIT(MDL_EXCLUSIVE), MDL_BIT(MDL_EXCLUSIVE), @@ -2255,6 +2260,7 @@ MDL_lock::MDL_object_lock::m_granted_incompatible[MDL_TYPE_END]= const MDL_lock::bitmap_t MDL_lock::MDL_object_lock::m_waiting_incompatible[MDL_TYPE_END]= { + 0, 0, MDL_BIT(MDL_EXCLUSIVE), 0, @@ -2330,6 +2336,7 @@ MDL_lock::MDL_object_lock::m_waiting_incompatible[MDL_TYPE_END]= const MDL_lock::bitmap_t MDL_lock::MDL_backup_lock::m_granted_incompatible[MDL_BACKUP_END]= { + 0, /* MDL_BACKUP_START */ 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), MDL_BIT(MDL_BACKUP_START), @@ -2357,6 +2364,7 @@ MDL_lock::MDL_backup_lock::m_granted_incompatible[MDL_BACKUP_END]= const MDL_lock::bitmap_t MDL_lock::MDL_backup_lock::m_waiting_incompatible[MDL_BACKUP_END]= { + 0, /* 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), 0, diff --git a/sql/mdl.h b/sql/mdl.h index 1b01bcf3ecb7b..18c00d554e856 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -38,7 +38,7 @@ typedef unsigned short mdl_bitmap_t; Get a bit corresponding to enum_mdl_type value in a granted/waiting bitmaps and compatibility matrices. */ -#define MDL_BIT(A) static_cast(1U << A) +#define MDL_BIT(A) static_cast(1U << ((A) - 1)) /** @@ -138,7 +138,7 @@ enum enum_mdl_type { that not-inited request has MDL_INTENTION_EXCLUSIVE. Must fix tests, as at least mysql_rm_table_no_locks() depends on this. */ - MDL_NOT_INITIALIZED= -1, + MDL_NOT_INITIALIZED= 0, /* An intention exclusive metadata lock (IX). Used only for scoped locks. Owner of this type of lock can acquire upgradable exclusive locks on @@ -149,7 +149,7 @@ enum enum_mdl_type { object metadata. Object may refer table, stored procedure, trigger, view/etc. */ - MDL_INTENTION_EXCLUSIVE= 0, + MDL_INTENTION_EXCLUSIVE, /* A shared metadata lock (S). To be used in cases when we are interested in object metadata only @@ -273,51 +273,51 @@ enum enum_mdl_type { /** Block concurrent backup */ -#define MDL_BACKUP_START enum_mdl_type(0) +#define MDL_BACKUP_START enum_mdl_type(1) /** Block new write requests to non transactional tables */ -#define MDL_BACKUP_FLUSH enum_mdl_type(1) +#define MDL_BACKUP_FLUSH enum_mdl_type(2) /** In addition to previous locks, blocks running requests to non trans tables Used to wait until all DML usage of on trans tables are finished */ -#define MDL_BACKUP_WAIT_FLUSH enum_mdl_type(2) +#define MDL_BACKUP_WAIT_FLUSH enum_mdl_type(3) /** In addition to previous locks, blocks new DDL's from starting */ -#define MDL_BACKUP_WAIT_DDL enum_mdl_type(3) +#define MDL_BACKUP_WAIT_DDL enum_mdl_type(4) /** In addition to previous locks, blocks commits */ -#define MDL_BACKUP_WAIT_COMMIT enum_mdl_type(4) +#define MDL_BACKUP_WAIT_COMMIT enum_mdl_type(5) /** Blocks (or is blocked by) statements that intend to modify data. Acquired before commit lock by FLUSH TABLES WITH READ LOCK. */ -#define MDL_BACKUP_FTWRL1 enum_mdl_type(5) +#define MDL_BACKUP_FTWRL1 enum_mdl_type(6) /** Blocks (or is blocked by) commits. Acquired after global read lock by FLUSH TABLES WITH READ LOCK. */ -#define MDL_BACKUP_FTWRL2 enum_mdl_type(6) +#define MDL_BACKUP_FTWRL2 enum_mdl_type(7) -#define MDL_BACKUP_DML enum_mdl_type(7) -#define MDL_BACKUP_TRANS_DML enum_mdl_type(8) -#define MDL_BACKUP_SYS_DML enum_mdl_type(9) +#define MDL_BACKUP_DML enum_mdl_type(8) +#define MDL_BACKUP_TRANS_DML enum_mdl_type(9) +#define MDL_BACKUP_SYS_DML enum_mdl_type(10) /** Must be acquired by DDL statements that intend to modify data. Currently it's also used for LOCK TABLES. */ -#define MDL_BACKUP_DDL enum_mdl_type(10) +#define MDL_BACKUP_DDL enum_mdl_type(11) /** Blocks new DDL's. Used by backup code to enable DDL logging */ -#define MDL_BACKUP_BLOCK_DDL enum_mdl_type(11) +#define MDL_BACKUP_BLOCK_DDL enum_mdl_type(12) /* Statement is modifying data, but will not block MDL_BACKUP_DDL or earlier @@ -326,13 +326,13 @@ enum enum_mdl_type { MDL_BACKUP_ALTER_COPY while alter table is copying or modifying data. */ -#define MDL_BACKUP_ALTER_COPY enum_mdl_type(12) +#define MDL_BACKUP_ALTER_COPY enum_mdl_type(13) /** Must be acquired during commit. */ -#define MDL_BACKUP_COMMIT enum_mdl_type(13) -#define MDL_BACKUP_END enum_mdl_type(14) +#define MDL_BACKUP_COMMIT enum_mdl_type(14) +#define MDL_BACKUP_END enum_mdl_type(15) /** Duration of metadata lock. */ From fd6d1502484ce05c1fbc83292653ca7e27a54676 Mon Sep 17 00:00:00 2001 From: PranavKTiwari Date: Wed, 8 Apr 2026 17:20:12 +0530 Subject: [PATCH 2/2] 12.3-MDEV-39184 We have 16 bits and we have enums till 15 (0 to 15) even after increment. So if I leave MDL_BIT unchanged (do not subtract 1), it will work as bit masking is supported and in the range. --- sql/mdl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/mdl.h b/sql/mdl.h index 18c00d554e856..adafcfe44c8e7 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -38,7 +38,7 @@ typedef unsigned short mdl_bitmap_t; Get a bit corresponding to enum_mdl_type value in a granted/waiting bitmaps and compatibility matrices. */ -#define MDL_BIT(A) static_cast(1U << ((A) - 1)) +#define MDL_BIT(A) static_cast(1U << A) /**