diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index 3957c85593e..304f9ac63df 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -316,6 +316,8 @@ struct recv_addr_t { /** List of log records for this page */ List rec_list; + + lsn_t max_lsn; }; // Forward declaration diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 2b277e5aace..c2c10f3ff69 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2511,6 +2511,7 @@ static void recv_add_to_hash_table(mlog_id_t type, space_id_t space_id, recv_addr->space = space_id; recv_addr->page_no = page_no; recv_addr->state = RECV_NOT_PROCESSED; + recv_addr->max_lsn = 0; UT_LIST_INIT(recv_addr->rec_list); @@ -2521,6 +2522,8 @@ static void recv_add_to_hash_table(mlog_id_t type, space_id_t space_id, ++recv_sys->n_addrs; } + recv_addr->max_lsn = recv->end_lsn; + UT_LIST_ADD_LAST(recv_addr->rec_list, recv); recv_data_t **prev_field; @@ -2731,6 +2734,29 @@ void recv_recover_page_func( if (page_newest_lsn) { page_lsn = page_newest_lsn; } + + if (page_lsn >= recv_addr->max_lsn){ + + mtr.discard_modifications(); + + mtr_commit(&mtr); + + mutex_enter(&recv_sys->mutex); + + if (recv_max_page_lsn < page_lsn) { + recv_max_page_lsn = page_lsn; + } + + recv_addr->state = RECV_PROCESSED; + + ut_a(recv_sys->n_addrs > 0); + --recv_sys->n_addrs; + + mutex_exit(&recv_sys->mutex); + + return; + } + #else /* !UNIV_HOTBACKUP */ /* In recovery from a backup we do not really use the buffer pool */ lsn_t page_newest_lsn = 0;