mariadb/mysql-test/suite
Marko Mäkelä de4030e4d4 MDEV-30400 Assertion height == btr_page_get_level(...) on INSERT
This also fixes part of MDEV-29835 Partial server freeze
which is caused by violations of the latching order that was
defined in https://dev.mysql.com/worklog/task/?id=6326
(WL#6326: InnoDB: fix index->lock contention). Unless the
current thread is holding an exclusive dict_index_t::lock,
it must acquire page latches in a strict parent-to-child,
left-to-right order. Not all cases of MDEV-29835 are fixed yet.
Failure to follow the correct latching order will cause deadlocks
of threads due to lock order inversion.

As part of these changes, the BTR_MODIFY_TREE mode is modified
so that an Update latch (U a.k.a. SX) will be acquired on the
root page, and eXclusive latches (X) will be acquired on all pages
leading to the leaf page, as well as any left and right siblings
of the pages along the path. The DEBUG_SYNC test innodb.innodb_wl6326
will be removed, because at the time the DEBUG_SYNC point is hit,
the thread is actually holding several page latches that will be
blocking a concurrent SELECT statement.

We also remove double bookkeeping that was caused due to excessive
information hiding in mtr_t::m_memo. We simply let mtr_t::m_memo
store information of latched pages, and ensure that
mtr_memo_slot_t::object is never a null pointer.
The tree_blocks[] and tree_savepoints[] were redundant.

buf_page_get_low(): If innodb_change_buffering_debug=1, to avoid
a hang, do not try to evict blocks if we are holding a latch on
a modified page. The test innodb.innodb-change-buffer-recovery
will be removed, because change buffering may no longer be forced
by debug injection when the change buffer comprises multiple pages.
Remove a debug assertion that could fail when
innodb_change_buffering_debug=1 fails to evict a page.
For other cases, the assertion is redundant, because we already
checked that right after the got_block: label. The test
innodb.innodb-change-buffering-recovery will be removed, because
due to this change, we will be unable to evict the desired page.

mtr_t::lock_register(): Register a change of a page latch
on an unmodified buffer-fixed block.

mtr_t::x_latch_at_savepoint(), mtr_t::sx_latch_at_savepoint():
Replaced by the use of mtr_t::upgrade_buffer_fix(), which now
also handles RW_S_LATCH.

mtr_t::set_modified(): For temporary tables, invoke
buf_page_t::set_modified() here and not in mtr_t::commit().
We will never set the MTR_MEMO_MODIFY flag on other than
persistent data pages, nor set mtr_t::m_modifications when
temporary data pages are modified.

mtr_t::commit(): Only invoke the buf_flush_note_modification() loop
if persistent data pages were modified.

mtr_t::get_already_latched(): Look up a latched page in mtr_t::m_memo.
This avoids many redundant entries in mtr_t::m_memo, as well as
redundant calls to buf_page_get_gen() for blocks that had already
been looked up in a mini-transaction.

btr_get_latched_root(): Return a pointer to an already latched root page.
This replaces btr_root_block_get() in cases where the mini-transaction
has already latched the root page.

btr_page_get_parent(): Fetch a parent page that was already latched
in BTR_MODIFY_TREE, by invoking mtr_t::get_already_latched().
If needed, upgrade the root page U latch to X.
This avoids bloating mtr_t::m_memo as well as performing redundant
buf_pool.page_hash lookups. For non-QUICK CHECK TABLE as well as for
B-tree defragmentation, we will invoke btr_cur_search_to_nth_level().

btr_cur_search_to_nth_level(): This will only be used for non-leaf
(level>0) B-tree searches that were formerly named BTR_CONT_SEARCH_TREE
or BTR_CONT_MODIFY_TREE. In MDEV-29835, this function could be
removed altogether, or retained for the case of
CHECK TABLE without QUICK.

btr_cur_t::left_block: Remove. btr_pcur_move_backward_from_page()
can retrieve the left sibling from the end of mtr_t::m_memo.

btr_cur_t::open_leaf(): Some clean-up.

btr_cur_t::search_leaf(): Replaces btr_cur_search_to_nth_level()
for searches to level=0 (the leaf level). We will never release
parent page latches before acquiring leaf page latches. If we need to
temporarily release the level=1 page latch in the BTR_SEARCH_PREV or
BTR_MODIFY_PREV latch_mode, we will reposition the cursor on the
child node pointer so that we will land on the correct leaf page.

btr_cur_t::pessimistic_search_leaf(): Implement new BTR_MODIFY_TREE
latching logic in the case that page splits or merges will be needed.
The parent pages (and their siblings) should already be latched on
the first dive to the leaf and be present in mtr_t::m_memo; there
should be no need for BTR_CONT_MODIFY_TREE. This pre-latching almost
suffices; it must be revised in MDEV-29835 and work-arounds removed
for cases where mtr_t::get_already_latched() fails to find a block.

rtr_search_to_nth_level(): A SPATIAL INDEX version of
btr_search_to_nth_level() that can search to any level
(including the leaf level).

rtr_search_leaf(), rtr_insert_leaf(): Wrappers for
rtr_search_to_nth_level().

rtr_search(): Replaces rtr_pcur_open().

rtr_latch_leaves(): Replaces btr_cur_latch_leaves(). Note that unlike
in the B-tree code, there is no error handling in case the sibling
pages are corrupted.

rtr_cur_restore_position(): Remove an unused constant parameter.

btr_pcur_open_on_user_rec(): Remove the constant parameter
mode=PAGE_CUR_GE.

row_ins_clust_index_entry_low(): Use a new
mode=BTR_MODIFY_ROOT_AND_LEAF to gain access to the root page
when mode!=BTR_MODIFY_TREE, to write the PAGE_ROOT_AUTO_INC.

BTR_SEARCH_TREE, BTR_CONT_SEARCH_TREE: Remove.

BTR_CONT_MODIFY_TREE: Note that this is only used by
rtr_search_to_nth_level().

btr_pcur_optimistic_latch_leaves(): Replaces
btr_cur_optimistic_latch_leaves().

ibuf_delete_rec(): Acquire exclusive ibuf.index->lock in order
to avoid a deadlock with ibuf_insert_low(BTR_MODIFY_PREV).

btr_blob_log_check_t(): Acquire a U latch on the root page,
so that btr_page_alloc() in btr_store_big_rec_extern_fields()
will avoid a deadlock.

btr_store_big_rec_extern_fields(): Assert that the root page latch
is being held.

Tested by: Matthias Leich
Reviewed by: Vladislav Lesin
2023-01-24 14:09:21 +02:00
..
archive Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
atomic Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
binlog Merge 10.5 into 10.6 2023-01-13 10:45:41 +02:00
binlog_encryption Merge branch '10.5' into bb-10.6-release 2022-08-03 12:19:59 +02:00
client
compat Merge 10.5 into 10.6 2022-11-17 08:37:35 +02:00
csv
encryption Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
engines Merge branch '10.5' into 10.6 2022-10-02 22:14:21 +02:00
federated MDEV-30395 Wrong result with semijoin and Federated as outer table 2023-01-13 16:23:21 +02:00
funcs_1 Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
funcs_2 Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00
galera MDEV-24623 Replicate bulk insert as table-level exclusive key 2023-01-24 11:54:25 +02:00
galera_3nodes Merge 10.5 into 10.6 2023-01-23 13:15:41 +02:00
galera_3nodes_sr Merge 10.5 into 10.6 2023-01-17 20:02:29 +02:00
galera_sr Merge branch '10.5' into 10.6 2022-12-15 18:27:11 +11:00
gcol Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00
handler Merge branch '10.5' into 10.6 2022-05-10 14:01:23 +02:00
heap Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
innodb MDEV-30400 Assertion height == btr_page_get_level(...) on INSERT 2023-01-24 14:09:21 +02:00
innodb_fts MDEV-30346 Avoid block device required error in innodb_fts.misc_debug 2023-01-05 11:07:55 +05:30
innodb_gis MDEV-30400 Assertion height == btr_page_get_level(...) on INSERT 2023-01-24 14:09:21 +02:00
innodb_i_s Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
innodb_zip Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
jp Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
json MDEV-28480: Assertion `0' failed in Item_row::illegal_method_call on 2022-10-13 14:55:27 +05:30
large_tests
maria Merge 10.5 into 10.6 2022-11-10 17:30:15 +02:00
mariabackup MDEV-29896: mariadb-backup --backup --incremental --throttle=... hangs 2022-12-21 13:41:10 +02:00
mtr/t
mtr2
multi_source Merge 10.5 into 10.6 2022-07-01 15:24:50 +03:00
optimizer_unfixed_bugs MDEV-29710: Disable some slow tests on Valgrind 2022-10-06 08:42:26 +03:00
parts Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00
perfschema sporadic failures of perfschema.statement_program_concurrency 2022-12-24 18:53:16 +01:00
perfschema_stress
period Merge 10.5 into 10.6 2022-12-05 18:04:23 +02:00
plugins Merge 10.5 into 10.6 2023-01-13 10:45:41 +02:00
roles Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
rpl Merge 10.5 into 10.6 2022-12-13 16:58:58 +02:00
s3 Merge 10.5 into 10.6 2022-09-20 16:53:20 +03:00
sql_sequence Merge 10.5 into 10.6 2022-10-25 14:25:42 +03:00
storage_engine
stress Merge 10.5 into 10.6 2022-10-06 09:22:39 +03:00
sys_vars MDEV-26391 BF abortable mariabackup execution 2023-01-17 10:03:05 +02:00
sysschema MDEV-29822 - disable a test that fails sporadically 2022-12-06 13:31:11 +01:00
unit
vcol Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00
versioning Merge 10.5 into 10.6 2023-01-13 10:45:41 +02:00
wsrep Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00