diff options
Diffstat (limited to 'storage/innobase/log/log0recv.cc')
-rw-r--r-- | storage/innobase/log/log0recv.cc | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 524f359e8d0..9562e50cb1c 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -4088,33 +4088,38 @@ recv_recovery_rollback_active(void) } } -bool recv_dblwr_t::validate_page(fil_space_t* space, ulint page_no, - const byte* page, bool dblwr_page, - byte* tmp_buf) +bool recv_dblwr_t::validate_page(const page_id_t page_id, + const byte *page, + const fil_space_t *space, + byte *tmp_buf) { - ut_ad(tmp_buf); - byte *tmp_frame = tmp_buf; - byte *tmp_page = tmp_buf + srv_page_size; - const uint16_t page_type= mach_read_from_2(page + FIL_PAGE_TYPE); - const page_size_t page_size(space->flags); - const ulint phy_size= page_size.physical(); - const bool expect_encrypted= space->crypt_data && - space->crypt_data->type != CRYPT_SCHEME_UNENCRYPTED; - - if (dblwr_page) + ut_ad(space || !page_id.page_no()); + if (page_id.page_no() == 0) { ulint flags= fsp_header_get_flags(page); - if (page_no == 0 && !fsp_flags_is_valid(flags, space->id) && + if (!fsp_flags_is_valid(flags, page_id.space()) && fsp_flags_convert_from_101(flags) == ULINT_UNDEFINED) { ib::warn() << "Ignoring a doublewrite copy of page " - << page_id_t(space->id, page_no) + << page_id << "due to invalid flags " << ib::hex(flags); return false; } + + return !buf_page_is_corrupted(true, page, page_size_t(flags), NULL); } - if (page_no && expect_encrypted && + ut_ad(tmp_buf); + ut_ad(space); + byte *tmp_frame = tmp_buf; + byte *tmp_page = tmp_buf + srv_page_size; + const uint16_t page_type= mach_read_from_2(page + FIL_PAGE_TYPE); + const page_size_t page_size(space->flags); + const ulint phy_size= page_size.physical(); + const bool expect_encrypted= space->crypt_data && + space->crypt_data->type != CRYPT_SCHEME_UNENCRYPTED; + + if (expect_encrypted && mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION)) { if (!fil_space_verify_crypt_checksum(page, page_size)) @@ -4143,15 +4148,9 @@ bool recv_dblwr_t::validate_page(fil_space_t* space, ulint page_no, return !buf_page_is_corrupted(true, page, page_size, space); } -/** Find a doublewrite copy of a page. -@param[in] space_id tablespace identifier -@param[in] page_no page number -@param[in] validate validate the doublewrite buffer page -@return page frame -@retval NULL if no page was found */ byte* recv_dblwr_t::find_page(ulint space_id, ulint page_no, - fil_space_t *space, byte *tmp_buf) + const fil_space_t *space, byte *tmp_buf) { byte *result= NULL; lsn_t max_lsn= 0; @@ -4164,9 +4163,9 @@ recv_dblwr_t::find_page(ulint space_id, ulint page_no, continue; const lsn_t lsn= mach_read_from_8(page + FIL_PAGE_LSN); if (lsn <= max_lsn || - (space && !validate_page(space, page_no, page, true, tmp_buf))) + !validate_page(page_id_t(space_id, page_no), page, space, tmp_buf)) { - /* Reset the PAGE_LSN to 0 for the older dblwr pages */ + /* Mark processed for subsequent iterations in buf_dblwr_process() */ memset(page + FIL_PAGE_LSN, 0, 8); continue; } |