summaryrefslogtreecommitdiff
path: root/storage/innobase/log/log0recv.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/log/log0recv.cc')
-rw-r--r--storage/innobase/log/log0recv.cc49
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;
}