diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-07-20 15:55:59 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-07-20 15:55:59 +0300 |
commit | 4d4865de6f124ed0a97573bf784102077f7296e7 (patch) | |
tree | 4b76dc03f45f1e795c78f899b59e161ba3b1b669 /storage/innobase/mtr | |
parent | 6c165b4bd69d1b9419758e8aa2b9c2958f015a98 (diff) | |
parent | 4b959bd8df18a281248c7325a61f4a79ce7691da (diff) | |
download | mariadb-git-4d4865de6f124ed0a97573bf784102077f7296e7.tar.gz |
Merge 10.4 into 10.5
Diffstat (limited to 'storage/innobase/mtr')
-rw-r--r-- | storage/innobase/mtr/mtr0mtr.cc | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 940429b2cd6..8a542a9f842 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -218,6 +218,13 @@ static void memo_slot_release(mtr_memo_slot_t *slot) case MTR_MEMO_SX_LOCK: rw_lock_sx_unlock(reinterpret_cast<rw_lock_t*>(slot->object)); break; + case MTR_MEMO_SPACE_X_LOCK: + { + fil_space_t *space= static_cast<fil_space_t*>(slot->object); + space->committed_size= space->size; + rw_lock_x_unlock(&space->latch); + } + break; case MTR_MEMO_X_LOCK: rw_lock_x_unlock(reinterpret_cast<rw_lock_t*>(slot->object)); break; @@ -251,6 +258,13 @@ struct ReleaseLatches { case MTR_MEMO_S_LOCK: rw_lock_s_unlock(reinterpret_cast<rw_lock_t*>(slot->object)); break; + case MTR_MEMO_SPACE_X_LOCK: + { + fil_space_t *space= static_cast<fil_space_t*>(slot->object); + space->committed_size= space->size; + rw_lock_x_unlock(&space->latch); + } + break; case MTR_MEMO_X_LOCK: rw_lock_x_unlock(reinterpret_cast<rw_lock_t*>(slot->object)); break; @@ -427,7 +441,7 @@ void mtr_t::commit() freed_space= fil_system.sys_space; } - ut_ad(memo_contains(freed_space->latch, MTR_MEMO_X_LOCK)); + ut_ad(memo_contains(*freed_space)); /* Update the last freed lsn */ freed_space->update_last_freed_lsn(m_commit_lsn); @@ -719,6 +733,18 @@ bool mtr_t::memo_contains(const rw_lock_t &lock, mtr_memo_type_t type) return true; } +/** Check if we are holding exclusive tablespace latch +@param space tablespace to search for +@return whether space.latch is being held */ +bool mtr_t::memo_contains(const fil_space_t& space) +{ + Iterate<Find> iteration(Find(&space, MTR_MEMO_SPACE_X_LOCK)); + if (m_memo.for_each_block_in_reverse(iteration)) + return false; + ut_ad(rw_lock_own(const_cast<rw_lock_t*>(&space.latch), RW_LOCK_X)); + return true; +} + /** Debug check for flags */ struct FlaggedCheck { FlaggedCheck(const void* ptr, ulint flags) |