From 02eb8f7246dfe6c3caf0ee79dca243e3d64ad418 Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Sun, 4 May 2025 01:59:52 +0400 Subject: [PATCH] MDL_lock encapsulation: MDL_lock::get_key() Avoid accessing MDL_lock::key from outside of MDL_lock class directly, use MDL_lock::get_key() instead. This is part of broader cleanup, which aims to make large part of MDL_lock members private. It is needed to simplify further work on MDEV-19749 - MDL scalability regression after backup locks. --- .../metadata_lock_info/metadata_lock_info.cc | 2 +- sql/item_func.cc | 2 +- sql/mdl.cc | 48 +++++++++---------- sql/mdl.h | 2 +- sql/vector_mhnsw.cc | 2 +- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/plugin/metadata_lock_info/metadata_lock_info.cc b/plugin/metadata_lock_info/metadata_lock_info.cc index 7fe4b72b77f..0e19c9df174 100644 --- a/plugin/metadata_lock_info/metadata_lock_info.cc +++ b/plugin/metadata_lock_info/metadata_lock_info.cc @@ -75,7 +75,7 @@ int i_s_metadata_lock_info_fill_row( TABLE *table = param->table; DBUG_ENTER("i_s_metadata_lock_info_fill_row"); MDL_context *mdl_ctx = mdl_ticket->get_ctx(); - MDL_key *mdl_key = mdl_ticket->get_key(); + const MDL_key *mdl_key = mdl_ticket->get_key(); MDL_key::enum_mdl_namespace mdl_namespace = mdl_key->mdl_namespace(); if (!granted) DBUG_RETURN(0); diff --git a/sql/item_func.cc b/sql/item_func.cc index 7f7a12c8540..3edc33fd4c1 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -4165,7 +4165,7 @@ public: const uchar *ull_get_key(const void *ptr, size_t *length, my_bool) { User_level_lock *ull = (User_level_lock*) ptr; - MDL_key *key = ull->lock->get_key(); + const MDL_key *key = ull->lock->get_key(); *length= key->length(); return key->ptr(); } diff --git a/sql/mdl.cc b/sql/mdl.cc index 48e529c89c2..a4d21866491 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -257,7 +257,7 @@ private: const char *dbug_print_mdl(MDL_ticket *mdl_ticket) { thread_local char buffer[256]; - MDL_key *mdl_key= mdl_ticket->get_key(); + const MDL_key *mdl_key= mdl_ticket->get_key(); my_snprintf(buffer, sizeof(buffer) - 1, "%.*s/%.*s (%s)", (int) mdl_key->db_name_length(), mdl_key->db_name(), (int) mdl_key->name_length(), mdl_key->name(), @@ -688,6 +688,14 @@ public: lock->m_strategy= &m_object_lock_strategy; } + static const uchar *mdl_locks_key(const void *record, size_t *length, + my_bool) + { + const MDL_lock *lock= static_cast(record); + *length= lock->key.length(); + return lock->key.ptr(); + } + /** Return thread id of the thread to which the first ticket was @@ -884,6 +892,9 @@ end: { remove_ticket(pins, &MDL_lock::m_waiting, ticket); } + const MDL_key *get_key() const { return &key; } + + const MDL_lock_strategy *m_strategy; private: static const MDL_backup_lock m_backup_lock_strategy; @@ -900,18 +911,6 @@ const MDL_lock::MDL_object_lock MDL_lock::m_object_lock_strategy; static MDL_map mdl_locks; -extern "C" -{ -static const uchar *mdl_locks_key(const void *record, size_t *length, - my_bool) -{ - const MDL_lock *lock= static_cast(record); - *length= lock->key.length(); - return lock->key.ptr(); -} -} /* extern "C" */ - - /** Initialize the metadata locking subsystem. @@ -1002,7 +1001,7 @@ void MDL_map::init() m_backup_lock= new (std::nothrow) MDL_lock(&backup_lock_key); lf_hash_init(&m_locks, sizeof(MDL_lock), LF_HASH_UNIQUE, 0, 0, - mdl_locks_key, &my_charset_bin); + MDL_lock::mdl_locks_key, &my_charset_bin); m_locks.alloc.constructor= MDL_lock::lf_alloc_constructor; m_locks.alloc.destructor= MDL_lock::lf_alloc_destructor; m_locks.initializer= MDL_lock::lf_hash_initializer; @@ -1230,7 +1229,7 @@ MDL_ticket::~MDL_ticket() uint MDL_ticket::get_deadlock_weight() const { - if (m_lock->key.mdl_namespace() == MDL_key::BACKUP) + if (get_key()->mdl_namespace() == MDL_key::BACKUP) { if (m_type == MDL_BACKUP_FTWRL1) return DEADLOCK_WEIGHT_FTWRL1; @@ -2106,7 +2105,7 @@ MDL_context::find_ticket(MDL_request *mdl_request, while ((ticket= it++)) { - if (mdl_request->key.is_equal(&ticket->m_lock->key) && + if (mdl_request->key.is_equal(ticket->get_key()) && ticket->has_stronger_or_equal_type(mdl_request->type)) { DBUG_PRINT("info", ("Adding mdl lock %s to %s", @@ -2690,7 +2689,7 @@ MDL_context::upgrade_shared_lock(MDL_ticket *mdl_ticket, mdl_ticket->get_key()->mdl_namespace() != MDL_key::BACKUP) DBUG_RETURN(FALSE); - MDL_REQUEST_INIT_BY_KEY(&mdl_xlock_request, &mdl_ticket->m_lock->key, + MDL_REQUEST_INIT_BY_KEY(&mdl_xlock_request, mdl_ticket->get_key(), new_type, MDL_TRANSACTION); if (acquire_lock(&mdl_xlock_request, lock_wait_timeout)) @@ -2966,7 +2965,8 @@ void MDL_context::release_lock(enum_mdl_duration duration, MDL_ticket *ticket) MDL_lock *lock= ticket->m_lock; DBUG_ENTER("MDL_context::release_lock"); DBUG_PRINT("enter", ("db: '%s' name: '%s'", - lock->key.db_name(), lock->key.name())); + ticket->get_key()->db_name(), + ticket->get_key()->name())); DBUG_ASSERT(this == ticket->get_ctx()); DBUG_PRINT("mdl", ("Released: %s", dbug_print_mdl(ticket))); @@ -3156,9 +3156,9 @@ bool MDL_ticket::has_pending_conflicting_lock() const } /** Return a key identifying this lock. */ -MDL_key *MDL_ticket::get_key() const +const MDL_key *MDL_ticket::get_key() const { - return &m_lock->key; + return m_lock->get_key(); } /** @@ -3389,12 +3389,12 @@ void MDL_ticket::wsrep_report(bool debug) const { if (!debug) return; - const PSI_stage_info *psi_stage= m_lock->key.get_wait_state_name(); + const PSI_stage_info *psi_stage= get_key()->get_wait_state_name(); WSREP_DEBUG("MDL ticket: type: %s space: %s db: %s name: %s (%s)", get_type_name()->str, - wsrep_get_mdl_namespace_name(m_lock->key.mdl_namespace()), - m_lock->key.db_name(), - m_lock->key.name(), + wsrep_get_mdl_namespace_name(get_key()->mdl_namespace()), + get_key()->db_name(), + get_key()->name(), psi_stage->m_name); } #endif /* WITH_WSREP */ diff --git a/sql/mdl.h b/sql/mdl.h index 92fae6942dd..5af737f7e8b 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -730,7 +730,7 @@ public: const LEX_STRING *get_type_name() const; const LEX_STRING *get_type_name(enum_mdl_type type) const; MDL_lock *get_lock() const { return m_lock; } - MDL_key *get_key() const; + const MDL_key *get_key() const; void downgrade_lock(enum_mdl_type type); bool has_stronger_or_equal_type(enum_mdl_type type) const; diff --git a/sql/vector_mhnsw.cc b/sql/vector_mhnsw.cc index 99c96d3d949..81e2a71592e 100644 --- a/sql/vector_mhnsw.cc +++ b/sql/vector_mhnsw.cc @@ -670,7 +670,7 @@ int MHNSW_Trx::do_commit(THD *thd, bool) trx_next= trx->next; if (trx->table_id) { - MDL_key *key= trx->table_id->get_key(); + const MDL_key *key= trx->table_id->get_key(); LEX_CSTRING db= {key->db_name(), key->db_name_length()}, tbl= {key->name(), key->name_length()}; TABLE_LIST tl;