mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
MDEV-15855: Use atomics for dict_table_t::n_ref_count
Make dict_table_t::n_ref_count private, and protect it with a combination of dict_sys->mutex and atomics. We want to be able to invoke dict_table_t::release() without holding dict_sys->mutex.
This commit is contained in:
parent
fdb9e66fee
commit
d897b4dc25
6 changed files with 18 additions and 25 deletions
|
@ -1337,7 +1337,7 @@ void btr_search_drop_page_hash_when_freed(const page_id_t& page_id)
|
||||||
/* In all our callers, the table handle should
|
/* In all our callers, the table handle should
|
||||||
be open, or we should be in the process of
|
be open, or we should be in the process of
|
||||||
dropping the table (preventing eviction). */
|
dropping the table (preventing eviction). */
|
||||||
ut_ad(index->table->n_ref_count > 0
|
ut_ad(index->table->get_ref_count() > 0
|
||||||
|| mutex_own(&dict_sys->mutex));
|
|| mutex_own(&dict_sys->mutex));
|
||||||
btr_search_drop_page_hash_index(block);
|
btr_search_drop_page_hash_index(block);
|
||||||
}
|
}
|
||||||
|
|
|
@ -423,7 +423,7 @@ dict_table_try_drop_aborted(
|
||||||
dict_table_t* table, /*!< in: table, or NULL if it
|
dict_table_t* table, /*!< in: table, or NULL if it
|
||||||
needs to be looked up again */
|
needs to be looked up again */
|
||||||
table_id_t table_id, /*!< in: table identifier */
|
table_id_t table_id, /*!< in: table identifier */
|
||||||
ulint ref_count) /*!< in: expected table->n_ref_count */
|
int32 ref_count) /*!< in: expected table->n_ref_count */
|
||||||
{
|
{
|
||||||
trx_t* trx;
|
trx_t* trx;
|
||||||
|
|
||||||
|
@ -1353,7 +1353,7 @@ static
|
||||||
ibool
|
ibool
|
||||||
dict_table_can_be_evicted(
|
dict_table_can_be_evicted(
|
||||||
/*======================*/
|
/*======================*/
|
||||||
const dict_table_t* table) /*!< in: table to test */
|
dict_table_t* table) /*!< in: table to test */
|
||||||
{
|
{
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
ut_ad(mutex_own(&dict_sys->mutex));
|
||||||
ut_ad(rw_lock_own(dict_operation_lock, RW_LOCK_X));
|
ut_ad(rw_lock_own(dict_operation_lock, RW_LOCK_X));
|
||||||
|
|
|
@ -3058,7 +3058,7 @@ ha_innobase::update_thd(
|
||||||
m_user_thd, thd));
|
m_user_thd, thd));
|
||||||
|
|
||||||
/* The table should have been opened in ha_innobase::open(). */
|
/* The table should have been opened in ha_innobase::open(). */
|
||||||
DBUG_ASSERT(m_prebuilt->table->n_ref_count > 0);
|
DBUG_ASSERT(m_prebuilt->table->get_ref_count() > 0);
|
||||||
|
|
||||||
trx_t* trx = check_trx_exists(thd);
|
trx_t* trx = check_trx_exists(thd);
|
||||||
|
|
||||||
|
@ -14186,7 +14186,7 @@ ha_innobase::info_low(
|
||||||
m_prebuilt->trx->op_info = "returning various info to MariaDB";
|
m_prebuilt->trx->op_info = "returning various info to MariaDB";
|
||||||
|
|
||||||
ib_table = m_prebuilt->table;
|
ib_table = m_prebuilt->table;
|
||||||
DBUG_ASSERT(ib_table->n_ref_count > 0);
|
DBUG_ASSERT(ib_table->get_ref_count() > 0);
|
||||||
|
|
||||||
if (flag & HA_STATUS_TIME) {
|
if (flag & HA_STATUS_TIME) {
|
||||||
if (is_analyze || innobase_stats_on_metadata) {
|
if (is_analyze || innobase_stats_on_metadata) {
|
||||||
|
|
|
@ -1498,23 +1498,13 @@ dict_table_is_file_per_table(
|
||||||
return !is_system_tablespace(table->space);
|
return !is_system_tablespace(table->space);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get reference count.
|
|
||||||
@return current value of n_ref_count */
|
|
||||||
inline
|
|
||||||
ulint
|
|
||||||
dict_table_t::get_ref_count() const
|
|
||||||
{
|
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
|
||||||
return(n_ref_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Acquire the table handle. */
|
/** Acquire the table handle. */
|
||||||
inline
|
inline
|
||||||
void
|
void
|
||||||
dict_table_t::acquire()
|
dict_table_t::acquire()
|
||||||
{
|
{
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
ut_ad(mutex_own(&dict_sys->mutex));
|
||||||
++n_ref_count;
|
my_atomic_add32_explicit(&n_ref_count, 1, MY_MEMORY_ORDER_RELAXED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Release the table handle.
|
/** Release the table handle.
|
||||||
|
@ -1523,9 +1513,10 @@ inline
|
||||||
bool
|
bool
|
||||||
dict_table_t::release()
|
dict_table_t::release()
|
||||||
{
|
{
|
||||||
ut_ad(mutex_own(&dict_sys->mutex));
|
int32 n = my_atomic_add32_explicit(
|
||||||
ut_ad(n_ref_count > 0);
|
&n_ref_count, -1, MY_MEMORY_ORDER_RELAXED);
|
||||||
return !--n_ref_count;
|
ut_ad(n > 0);
|
||||||
|
return n == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Encode the number of columns and number of virtual columns in a
|
/** Encode the number of columns and number of virtual columns in a
|
||||||
|
|
|
@ -1357,7 +1357,11 @@ struct dict_table_t {
|
||||||
|
|
||||||
/** Get reference count.
|
/** Get reference count.
|
||||||
@return current value of n_ref_count */
|
@return current value of n_ref_count */
|
||||||
inline ulint get_ref_count() const;
|
inline int32 get_ref_count()
|
||||||
|
{
|
||||||
|
return my_atomic_load32_explicit(&n_ref_count,
|
||||||
|
MY_MEMORY_ORDER_RELAXED);
|
||||||
|
}
|
||||||
|
|
||||||
/** Acquire the table handle. */
|
/** Acquire the table handle. */
|
||||||
inline void acquire();
|
inline void acquire();
|
||||||
|
@ -1737,13 +1741,11 @@ struct dict_table_t {
|
||||||
It is protected by lock_sys->mutex. */
|
It is protected by lock_sys->mutex. */
|
||||||
ulint n_rec_locks;
|
ulint n_rec_locks;
|
||||||
|
|
||||||
#ifndef UNIV_DEBUG
|
|
||||||
private:
|
private:
|
||||||
#endif
|
|
||||||
/** Count of how many handles are opened to this table. Dropping of the
|
/** Count of how many handles are opened to this table. Dropping of the
|
||||||
table is NOT allowed until this count gets to zero. MySQL does NOT
|
table is NOT allowed until this count gets to zero. MySQL does NOT
|
||||||
itself check the number of open handles at DROP. */
|
itself check the number of open handles at DROP. */
|
||||||
ulint n_ref_count;
|
int32 n_ref_count;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** List of locks on the table. Protected by lock_sys->mutex. */
|
/** List of locks on the table. Protected by lock_sys->mutex. */
|
||||||
|
|
|
@ -1493,7 +1493,7 @@ lock_rec_create_low(
|
||||||
lock_rec_bitmap_reset(lock);
|
lock_rec_bitmap_reset(lock);
|
||||||
lock_rec_set_nth_bit(lock, heap_no);
|
lock_rec_set_nth_bit(lock, heap_no);
|
||||||
index->table->n_rec_locks++;
|
index->table->n_rec_locks++;
|
||||||
ut_ad(index->table->n_ref_count > 0 || !index->table->can_be_evicted);
|
ut_ad(index->table->get_ref_count() > 0 || !index->table->can_be_evicted);
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
if (c_lock && wsrep_on_trx(trx)
|
if (c_lock && wsrep_on_trx(trx)
|
||||||
|
@ -3664,7 +3664,7 @@ lock_table_create(
|
||||||
|
|
||||||
lock->un_member.tab_lock.table = table;
|
lock->un_member.tab_lock.table = table;
|
||||||
|
|
||||||
ut_ad(table->n_ref_count > 0 || !table->can_be_evicted);
|
ut_ad(table->get_ref_count() > 0 || !table->can_be_evicted);
|
||||||
|
|
||||||
UT_LIST_ADD_LAST(trx->lock.trx_locks, lock);
|
UT_LIST_ADD_LAST(trx->lock.trx_locks, lock);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue