mirror of
https://github.com/MariaDB/server.git
synced 2025-12-28 00:01:00 +00:00
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.
This commit is contained in:
parent
36bec5697b
commit
02eb8f7246
@ -75,7 +75,7 @@ int i_s_metadata_lock_info_fill_row(
|
|||||||
TABLE *table = param->table;
|
TABLE *table = param->table;
|
||||||
DBUG_ENTER("i_s_metadata_lock_info_fill_row");
|
DBUG_ENTER("i_s_metadata_lock_info_fill_row");
|
||||||
MDL_context *mdl_ctx = mdl_ticket->get_ctx();
|
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();
|
MDL_key::enum_mdl_namespace mdl_namespace = mdl_key->mdl_namespace();
|
||||||
if (!granted)
|
if (!granted)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|||||||
@ -4165,7 +4165,7 @@ public:
|
|||||||
const uchar *ull_get_key(const void *ptr, size_t *length, my_bool)
|
const uchar *ull_get_key(const void *ptr, size_t *length, my_bool)
|
||||||
{
|
{
|
||||||
User_level_lock *ull = (User_level_lock*) ptr;
|
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();
|
*length= key->length();
|
||||||
return key->ptr();
|
return key->ptr();
|
||||||
}
|
}
|
||||||
|
|||||||
48
sql/mdl.cc
48
sql/mdl.cc
@ -257,7 +257,7 @@ private:
|
|||||||
const char *dbug_print_mdl(MDL_ticket *mdl_ticket)
|
const char *dbug_print_mdl(MDL_ticket *mdl_ticket)
|
||||||
{
|
{
|
||||||
thread_local char buffer[256];
|
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)",
|
my_snprintf(buffer, sizeof(buffer) - 1, "%.*s/%.*s (%s)",
|
||||||
(int) mdl_key->db_name_length(), mdl_key->db_name(),
|
(int) mdl_key->db_name_length(), mdl_key->db_name(),
|
||||||
(int) mdl_key->name_length(), mdl_key->name(),
|
(int) mdl_key->name_length(), mdl_key->name(),
|
||||||
@ -688,6 +688,14 @@ public:
|
|||||||
lock->m_strategy= &m_object_lock_strategy;
|
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<const MDL_lock *>(record);
|
||||||
|
*length= lock->key.length();
|
||||||
|
return lock->key.ptr();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return thread id of the thread to which the first ticket was
|
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); }
|
{ remove_ticket(pins, &MDL_lock::m_waiting, ticket); }
|
||||||
|
|
||||||
|
|
||||||
|
const MDL_key *get_key() const { return &key; }
|
||||||
|
|
||||||
|
|
||||||
const MDL_lock_strategy *m_strategy;
|
const MDL_lock_strategy *m_strategy;
|
||||||
private:
|
private:
|
||||||
static const MDL_backup_lock m_backup_lock_strategy;
|
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;
|
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<const MDL_lock *>(record);
|
|
||||||
*length= lock->key.length();
|
|
||||||
return lock->key.ptr();
|
|
||||||
}
|
|
||||||
} /* extern "C" */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the metadata locking subsystem.
|
Initialize the metadata locking subsystem.
|
||||||
|
|
||||||
@ -1002,7 +1001,7 @@ void MDL_map::init()
|
|||||||
m_backup_lock= new (std::nothrow) MDL_lock(&backup_lock_key);
|
m_backup_lock= new (std::nothrow) MDL_lock(&backup_lock_key);
|
||||||
|
|
||||||
lf_hash_init(&m_locks, sizeof(MDL_lock), LF_HASH_UNIQUE, 0, 0,
|
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.constructor= MDL_lock::lf_alloc_constructor;
|
||||||
m_locks.alloc.destructor= MDL_lock::lf_alloc_destructor;
|
m_locks.alloc.destructor= MDL_lock::lf_alloc_destructor;
|
||||||
m_locks.initializer= MDL_lock::lf_hash_initializer;
|
m_locks.initializer= MDL_lock::lf_hash_initializer;
|
||||||
@ -1230,7 +1229,7 @@ MDL_ticket::~MDL_ticket()
|
|||||||
|
|
||||||
uint MDL_ticket::get_deadlock_weight() const
|
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)
|
if (m_type == MDL_BACKUP_FTWRL1)
|
||||||
return DEADLOCK_WEIGHT_FTWRL1;
|
return DEADLOCK_WEIGHT_FTWRL1;
|
||||||
@ -2106,7 +2105,7 @@ MDL_context::find_ticket(MDL_request *mdl_request,
|
|||||||
|
|
||||||
while ((ticket= it++))
|
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))
|
ticket->has_stronger_or_equal_type(mdl_request->type))
|
||||||
{
|
{
|
||||||
DBUG_PRINT("info", ("Adding mdl lock %s to %s",
|
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)
|
mdl_ticket->get_key()->mdl_namespace() != MDL_key::BACKUP)
|
||||||
DBUG_RETURN(FALSE);
|
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);
|
new_type, MDL_TRANSACTION);
|
||||||
|
|
||||||
if (acquire_lock(&mdl_xlock_request, lock_wait_timeout))
|
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;
|
MDL_lock *lock= ticket->m_lock;
|
||||||
DBUG_ENTER("MDL_context::release_lock");
|
DBUG_ENTER("MDL_context::release_lock");
|
||||||
DBUG_PRINT("enter", ("db: '%s' name: '%s'",
|
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_ASSERT(this == ticket->get_ctx());
|
||||||
DBUG_PRINT("mdl", ("Released: %s", dbug_print_mdl(ticket)));
|
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. */
|
/** 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;
|
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)",
|
WSREP_DEBUG("MDL ticket: type: %s space: %s db: %s name: %s (%s)",
|
||||||
get_type_name()->str,
|
get_type_name()->str,
|
||||||
wsrep_get_mdl_namespace_name(m_lock->key.mdl_namespace()),
|
wsrep_get_mdl_namespace_name(get_key()->mdl_namespace()),
|
||||||
m_lock->key.db_name(),
|
get_key()->db_name(),
|
||||||
m_lock->key.name(),
|
get_key()->name(),
|
||||||
psi_stage->m_name);
|
psi_stage->m_name);
|
||||||
}
|
}
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|||||||
@ -730,7 +730,7 @@ public:
|
|||||||
const LEX_STRING *get_type_name() const;
|
const LEX_STRING *get_type_name() const;
|
||||||
const LEX_STRING *get_type_name(enum_mdl_type type) const;
|
const LEX_STRING *get_type_name(enum_mdl_type type) const;
|
||||||
MDL_lock *get_lock() const { return m_lock; }
|
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);
|
void downgrade_lock(enum_mdl_type type);
|
||||||
|
|
||||||
bool has_stronger_or_equal_type(enum_mdl_type type) const;
|
bool has_stronger_or_equal_type(enum_mdl_type type) const;
|
||||||
|
|||||||
@ -670,7 +670,7 @@ int MHNSW_Trx::do_commit(THD *thd, bool)
|
|||||||
trx_next= trx->next;
|
trx_next= trx->next;
|
||||||
if (trx->table_id)
|
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()},
|
LEX_CSTRING db= {key->db_name(), key->db_name_length()},
|
||||||
tbl= {key->name(), key->name_length()};
|
tbl= {key->name(), key->name_length()};
|
||||||
TABLE_LIST tl;
|
TABLE_LIST tl;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user