diff --git a/include/mysql/components/services/bits/psi_mdl_bits.h b/include/mysql/components/services/bits/psi_mdl_bits.h index fc8b8b02a4b..09c7b697888 100644 --- a/include/mysql/components/services/bits/psi_mdl_bits.h +++ b/include/mysql/components/services/bits/psi_mdl_bits.h @@ -94,6 +94,9 @@ typedef void (*set_metadata_lock_status_v1_t)(PSI_metadata_lock *lock, typedef void (*set_metadata_lock_duration_v2_t)( PSI_metadata_lock *lock, opaque_mdl_duration mdl_duration); +typedef void (*set_metadata_lock_type_v2_t)( + PSI_metadata_lock *lock, opaque_mdl_type mdl_type); + typedef void (*destroy_metadata_lock_v1_t)(PSI_metadata_lock *lock); typedef struct PSI_metadata_locker *(*start_metadata_wait_v1_t)( diff --git a/include/mysql/components/services/psi_mdl_service.h b/include/mysql/components/services/psi_mdl_service.h index e2264d3cc66..afca347a885 100644 --- a/include/mysql/components/services/psi_mdl_service.h +++ b/include/mysql/components/services/psi_mdl_service.h @@ -51,6 +51,7 @@ create_metadata_lock_v1_t create_metadata_lock; set_metadata_lock_status_v1_t set_metadata_lock_status; /* Added in version 2. */ set_metadata_lock_duration_v2_t set_metadata_lock_duration; +set_metadata_lock_type_v2_t set_metadata_lock_type; destroy_metadata_lock_v1_t destroy_metadata_lock; start_metadata_wait_v1_t start_metadata_wait; end_metadata_wait_v1_t end_metadata_wait; diff --git a/include/mysql/psi/mysql_mdl.h b/include/mysql/psi/mysql_mdl.h index 05a9a7fff75..f3635b6b441 100644 --- a/include/mysql/psi/mysql_mdl.h +++ b/include/mysql/psi/mysql_mdl.h @@ -84,6 +84,14 @@ } while (0) #endif +#ifdef HAVE_PSI_METADATA_INTERFACE +#define mysql_mdl_set_type(L, D) inline_mysql_mdl_set_type(L, D) +#else +#define mysql_mdl_set_type(L, D) \ + do { \ + } while (0) +#endif + /** @def mysql_mdl_destroy(M) Instrumented metadata lock destruction. @@ -128,6 +136,13 @@ static inline void inline_mysql_mdl_set_duration( } } +static inline void inline_mysql_mdl_set_type( + PSI_metadata_lock *psi, enum_mdl_type mdl_type) { + if (psi != nullptr) { + PSI_METADATA_CALL(set_metadata_lock_type)(psi, mdl_type); + } +} + static inline void inline_mysql_mdl_destroy(PSI_metadata_lock *psi, const char *, uint) { if (psi != nullptr) { diff --git a/include/mysql/psi/psi_abi_mdl_v1.h.pp b/include/mysql/psi/psi_abi_mdl_v1.h.pp index 2b9f739f9f7..fdcb2700e8a 100644 --- a/include/mysql/psi/psi_abi_mdl_v1.h.pp +++ b/include/mysql/psi/psi_abi_mdl_v1.h.pp @@ -44,6 +44,8 @@ typedef void (*set_metadata_lock_status_v1_t)(PSI_metadata_lock *lock, opaque_mdl_status mdl_status); typedef void (*set_metadata_lock_duration_v2_t)( PSI_metadata_lock *lock, opaque_mdl_duration mdl_duration); +typedef void (*set_metadata_lock_type_v2_t)( + PSI_metadata_lock *lock, opaque_mdl_type mdl_type); typedef void (*destroy_metadata_lock_v1_t)(PSI_metadata_lock *lock); typedef struct PSI_metadata_locker *(*start_metadata_wait_v1_t)( struct PSI_metadata_locker_state_v1 *state, struct PSI_metadata_lock *mdl, @@ -66,6 +68,7 @@ struct PSI_mdl_service_v2 { create_metadata_lock_v1_t create_metadata_lock; set_metadata_lock_status_v1_t set_metadata_lock_status; set_metadata_lock_duration_v2_t set_metadata_lock_duration; + set_metadata_lock_type_v2_t set_metadata_lock_type; destroy_metadata_lock_v1_t destroy_metadata_lock; start_metadata_wait_v1_t start_metadata_wait; end_metadata_wait_v1_t end_metadata_wait; diff --git a/include/mysql/psi/psi_mdl.h b/include/mysql/psi/psi_mdl.h index 38b44c5de45..13125242545 100644 --- a/include/mysql/psi/psi_mdl.h +++ b/include/mysql/psi/psi_mdl.h @@ -101,6 +101,7 @@ struct PSI_mdl_service_v2 { set_metadata_lock_status_v1_t set_metadata_lock_status; /* Added in version 2. */ set_metadata_lock_duration_v2_t set_metadata_lock_duration; + set_metadata_lock_type_v2_t set_metadata_lock_type; destroy_metadata_lock_v1_t destroy_metadata_lock; start_metadata_wait_v1_t start_metadata_wait; end_metadata_wait_v1_t end_metadata_wait; diff --git a/include/pfs_metadata_provider.h b/include/pfs_metadata_provider.h index f61f0890c69..cfdb5e32968 100644 --- a/include/pfs_metadata_provider.h +++ b/include/pfs_metadata_provider.h @@ -58,6 +58,9 @@ void pfs_set_metadata_lock_status_vc(PSI_metadata_lock *lock, void pfs_set_metadata_lock_duration_vc(PSI_metadata_lock *lock, opaque_mdl_duration mdl_duration); +void pfs_set_metadata_lock_type_vc(PSI_metadata_lock *lock, + opaque_mdl_type mdl_type); + void pfs_destroy_metadata_lock_vc(PSI_metadata_lock *lock); struct PSI_metadata_locker *pfs_start_metadata_wait_vc( diff --git a/mysys/psi_noop.cc b/mysys/psi_noop.cc index b4caa67b282..3d67225150b 100644 --- a/mysys/psi_noop.cc +++ b/mysys/psi_noop.cc @@ -563,6 +563,9 @@ static void set_metadata_lock_status_noop(PSI_metadata_lock *, static void set_metadata_lock_duration_noop(PSI_metadata_lock *, opaque_mdl_duration) {} +static void set_metadata_lock_type_noop(PSI_metadata_lock *, + opaque_mdl_type) {} + static void destroy_metadata_lock_noop(PSI_metadata_lock *) {} static PSI_metadata_locker *start_metadata_wait_noop( @@ -574,8 +577,9 @@ static void end_metadata_wait_noop(PSI_metadata_locker *, int) {} static PSI_mdl_service_t psi_mdl_noop = { create_metadata_lock_noop, set_metadata_lock_status_noop, - set_metadata_lock_duration_noop, destroy_metadata_lock_noop, - start_metadata_wait_noop, end_metadata_wait_noop}; + set_metadata_lock_duration_noop, set_metadata_lock_type_noop, + destroy_metadata_lock_noop, start_metadata_wait_noop, + end_metadata_wait_noop}; struct PSI_mdl_bootstrap *psi_mdl_hook = nullptr; PSI_mdl_service_t *psi_mdl_service = &psi_mdl_noop; diff --git a/sql/mdl.cc b/sql/mdl.cc index 8a105c07bdb..b4f7589fc4a 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -3817,6 +3817,7 @@ bool MDL_context::upgrade_shared_lock(MDL_ticket *mdl_ticket, } mdl_ticket->m_type = new_type; + mysql_mdl_set_type(mdl_ticket->m_psi, new_type); lock->m_granted.add_ticket(mdl_ticket); /* @@ -4342,6 +4343,7 @@ void MDL_ticket::downgrade_lock(enum_mdl_type new_type) { } } m_type = new_type; + mysql_mdl_set_type(m_psi, new_type); m_lock->m_granted.add_ticket(this); m_lock->reschedule_waiters(); mysql_prlock_unlock(&m_lock->m_rwlock); diff --git a/storage/perfschema/pfs.cc b/storage/perfschema/pfs.cc index 56d676cd95d..b444394d4ae 100644 --- a/storage/perfschema/pfs.cc +++ b/storage/perfschema/pfs.cc @@ -8758,6 +8758,13 @@ void pfs_set_metadata_lock_duration_vc(PSI_metadata_lock *lock, pfs->m_mdl_duration = mdl_duration; } +void pfs_set_metadata_lock_type_vc(PSI_metadata_lock *lock, + opaque_mdl_type mdl_type) { + auto *pfs = reinterpret_cast(lock); + assert(pfs != nullptr); + pfs->m_mdl_type = mdl_type; +} + void pfs_destroy_metadata_lock_vc(PSI_metadata_lock *lock) { auto *pfs = reinterpret_cast(lock); assert(pfs != nullptr); @@ -9452,8 +9459,9 @@ PSI_mdl_service_v1 pfs_mdl_service_v1 = { PSI_mdl_service_v2 pfs_mdl_service_v2 = { /* Old interface, for plugins. */ pfs_create_metadata_lock_vc, pfs_set_metadata_lock_status_vc, - pfs_set_metadata_lock_duration_vc, pfs_destroy_metadata_lock_vc, - pfs_start_metadata_wait_vc, pfs_end_metadata_wait_vc}; + pfs_set_metadata_lock_duration_vc, pfs_set_metadata_lock_type_vc, + pfs_destroy_metadata_lock_vc, pfs_start_metadata_wait_vc, + pfs_end_metadata_wait_vc}; SERVICE_TYPE(psi_mdl_v1) SERVICE_IMPLEMENTATION(performance_schema, psi_mdl_v1) = { @@ -9466,8 +9474,9 @@ SERVICE_TYPE(psi_mdl_v2) SERVICE_IMPLEMENTATION(performance_schema, psi_mdl_v2) = { /* New interface, for components. */ pfs_create_metadata_lock_vc, pfs_set_metadata_lock_status_vc, - pfs_set_metadata_lock_duration_vc, pfs_destroy_metadata_lock_vc, - pfs_start_metadata_wait_vc, pfs_end_metadata_wait_vc}; + pfs_set_metadata_lock_duration_vc, pfs_set_metadata_lock_type_vc, + pfs_destroy_metadata_lock_vc, pfs_start_metadata_wait_vc, + pfs_end_metadata_wait_vc}; PSI_idle_service_v1 pfs_idle_service_v1 = { /* Old interface, for plugins. */