summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-09-09 12:01:03 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-09-09 12:01:03 +0300
commitc26eae0cc02b0a8fd67901bf56adbb472c791981 (patch)
treeb640d816660c430b3f90885b68b6c699a33388ab
parentb1009ae5c16697d5eef443cc6a60a74301148c73 (diff)
downloadmariadb-git-c26eae0cc02b0a8fd67901bf56adbb472c791981.tar.gz
MDEV-23456 fixup: Fix mtr_t::get_fix_count()
Before commit 05fa4558e0e82302ece981deabce764491464eb2 (MDEV-22110) we have slot->type == MTR_MEMO_MODIFY that are unrelated to incrementing the buffer-fix count. FindBlock::operator(): In debug builds, skip MTR_MEMO_MODIFY entries. Also, simplify the code a little. This fixes an infinite loop in the tests innodb.innodb_defragment and innodb.innodb_wl6326_big.
-rw-r--r--storage/innobase/mtr/mtr0mtr.cc25
1 files changed, 8 insertions, 17 deletions
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index 6d0492f30f2..424ac0b53f0 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -313,25 +313,17 @@ mini-transaction */
struct FindBlock
{
int32_t num_fix;
- buf_block_t *block;
+ const buf_block_t *const block;
+
+ FindBlock(const buf_block_t *block_buf): num_fix(0), block(block_buf) {}
- FindBlock(buf_block_t *block_buf): num_fix(0), block(block_buf) {}
bool operator()(const mtr_memo_slot_t* slot)
{
- if (slot->object != NULL)
- {
- buf_block_t *mtr_block= reinterpret_cast<buf_block_t*>(slot->object);
- if (mtr_block == block)
- num_fix++;
- }
-
+ if (slot->object == block)
+ ut_d(if (slot->type != MTR_MEMO_MODIFY))
+ num_fix++;
return true;
}
-
- int32_t get_num_fix()
- {
- return num_fix;
- }
};
/** Release a resource acquired by the mini-transaction. */
@@ -832,10 +824,9 @@ mtr_t::release_free_extents(ulint n_reserved)
int32_t mtr_t::get_fix_count(buf_block_t *block)
{
- struct FindBlock find_block(block);
- Iterate<FindBlock> iteration(find_block);
+ Iterate<FindBlock> iteration((FindBlock(block)));
if (m_memo.for_each_block(iteration))
- return iteration.functor.get_num_fix();
+ return iteration.functor.num_fix;
return 0;
}