diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-03-03 13:55:43 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-03-03 13:55:43 +0200 |
commit | 71d30d01aa1426183526f9bdbc6d2a718fac75ac (patch) | |
tree | c184ce800889dced76c73bfb7cd93d78da0dd7c5 | |
parent | 1c7d4f8de7db9021a19bcb52d68d00e2d3106866 (diff) | |
parent | 4b166ca901dedd928cf61949b4268b490a06a564 (diff) | |
download | mariadb-git-bb-10.6-MDEV-25016.tar.gz |
Merge 10.5 into 10.6bb-10.6-MDEV-25016
-rw-r--r-- | storage/innobase/btr/btr0sea.cc | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 64aa2fa5bd3..4c12665504f 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -1265,13 +1265,24 @@ retry: auto part = btr_search_sys.get_part(index_id, block->page.id().space()); - part->latch.rd_lock(SRW_LOCK_CALL); + dict_index_t* index = block->index; + bool is_freed = index && index->freed(); + + if (is_freed) { + part->latch.wr_lock(SRW_LOCK_CALL); + } else { + part->latch.rd_lock(SRW_LOCK_CALL); + } + assert_block_ahi_valid(block); - dict_index_t* index = block->index; if (!index || !btr_search_enabled) { - part->latch.rd_unlock(); + if (is_freed) { + part->latch.wr_unlock(); + } else { + part->latch.rd_unlock(); + } return; } @@ -1290,7 +1301,9 @@ retry: /* NOTE: The AHI fields of block must not be accessed after releasing search latch, as the index page might only be s-latched! */ - part->latch.rd_unlock(); + if (!is_freed) { + part->latch.rd_unlock(); + } ut_a(n_fields > 0 || n_bytes > 0); @@ -1341,16 +1354,18 @@ next_rec: mem_heap_free(heap); } - part->latch.wr_lock(SRW_LOCK_CALL); + if (!is_freed) { + part->latch.wr_lock(SRW_LOCK_CALL); - if (UNIV_UNLIKELY(!block->index)) { - /* Someone else has meanwhile dropped the hash index */ + if (UNIV_UNLIKELY(!block->index)) { + /* Someone else has meanwhile dropped the + hash index */ + goto cleanup; + } - goto cleanup; + ut_a(block->index == index); } - ut_a(block->index == index); - if (block->curr_n_fields != n_fields || block->curr_n_bytes != n_bytes) { |