diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-08-03 16:51:41 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-08-18 14:59:16 +0530 |
commit | 362b18c53672c4c2f8c49545b8f5cc586e26a325 (patch) | |
tree | 4fdfc826e9ab5a1ee01cfc6938ebe9309ee51e1a | |
parent | 3e617b8bef50a81b10b8152d800a1b8b38859913 (diff) | |
download | mariadb-git-362b18c53672c4c2f8c49545b8f5cc586e26a325.tar.gz |
MDEV-23380 InnoDB reads a page from disk despite parsing MLOG_INIT_FILE_PAGE2 record
This problem is caused by 6697135c6d03935118c3dfa1c97faea7fa76afa6
(MDEV-21572). During recovery, InnoDB prefetches the siblings of
change buffer index leaf page. It does asynchronous page read
and recovery scenario wasn't handled in buf_read_page_background().
It leads to the refusal of startup of the server.
Solution:
=========
InnoDB shouldn't allow the change buffer index page siblings
to be prefetched.
-rw-r--r-- | storage/innobase/btr/btr0cur.cc | 5 | ||||
-rw-r--r-- | storage/innobase/include/dict0mem.h | 3 |
2 files changed, 6 insertions, 2 deletions
diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index d7d15faa852..770c6d73585 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -3145,7 +3145,7 @@ fail: /* prefetch siblings of the leaf for the pessimistic operation, if the page is leaf. */ - if (page_is_leaf(page)) { + if (page_is_leaf(page) && !index->is_ibuf()) { btr_cur_prefetch_siblings(block); } fail_err: @@ -4041,6 +4041,7 @@ btr_cur_optimistic_update( if (rec_offs_any_extern(*offsets)) { any_extern: + ut_ad(!index->is_ibuf()); /* Externally stored fields are treated in pessimistic update */ @@ -4220,7 +4221,7 @@ func_exit: } } - if (err != DB_SUCCESS) { + if (err != DB_SUCCESS && !index->is_ibuf()) { /* prefetch siblings of the leaf for the pessimistic operation. */ btr_cur_prefetch_siblings(block); diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 0d4ee9d23ec..804176e2d5b 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -1034,6 +1034,9 @@ struct dict_index_t{ } } + /** @return whether this is the change buffer */ + bool is_ibuf() const { return UNIV_UNLIKELY(type & DICT_IBUF); } + #ifdef BTR_CUR_HASH_ADAPT /** @return a clone of this */ dict_index_t* clone() const; |