MDEV-22901 Accessing btr_search_sys->hash_tables when buffer pool resize happens

- btr_get_search_table() is accessing btr_search_sys->hash_tables,
which is not safe if the buffer pool resize happens concurrently.
parent 32b34cb9
...@@ -1485,20 +1485,12 @@ btr_search_build_page_hash_index( ...@@ -1485,20 +1485,12 @@ btr_search_build_page_hash_index(
btr_search_check_free_space_in_heap(index); btr_search_check_free_space_in_heap(index);
hash_table_t* table = btr_get_search_table(index);
rw_lock_x_lock(ahi_latch); rw_lock_x_lock(ahi_latch);
if (!btr_search_enabled) { if (!btr_search_enabled) {
goto exit_func; goto exit_func;
} }
table = btr_get_search_table(index);
if (block->index && ((block->curr_n_fields != n_fields)
|| (block->curr_n_bytes != n_bytes)
|| (block->curr_left_side != left_side))) {
goto exit_func;
}
/* This counter is decremented every time we drop page /* This counter is decremented every time we drop page
hash index entries and is incremented here. Since we can hash index entries and is incremented here. Since we can
rebuild hash index for a page that is already hashed, we rebuild hash index for a page that is already hashed, we
...@@ -1507,6 +1499,10 @@ btr_search_build_page_hash_index( ...@@ -1507,6 +1499,10 @@ btr_search_build_page_hash_index(
if (!block->index) { if (!block->index) {
assert_block_ahi_empty(block); assert_block_ahi_empty(block);
index->search_info->ref_count++; index->search_info->ref_count++;
} else if (block->curr_n_fields != n_fields
|| block->curr_n_bytes != n_bytes
|| block->curr_left_side != left_side) {
goto exit_func;
} }
block->n_hash_helps = 0; block->n_hash_helps = 0;
...@@ -1516,9 +1512,11 @@ btr_search_build_page_hash_index( ...@@ -1516,9 +1512,11 @@ btr_search_build_page_hash_index(
block->curr_left_side = unsigned(left_side); block->curr_left_side = unsigned(left_side);
block->index = index; block->index = index;
for (i = 0; i < n_cached; i++) { {
hash_table_t* table = btr_get_search_table(index);
ha_insert_for_fold(table, folds[i], block, recs[i]); for (i = 0; i < n_cached; i++) {
ha_insert_for_fold(table, folds[i], block, recs[i]);
}
} }
MONITOR_INC(MONITOR_ADAPTIVE_HASH_PAGE_ADDED); MONITOR_INC(MONITOR_ADAPTIVE_HASH_PAGE_ADDED);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment