mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 14:02:32 +01:00
branches/zip: Implement crash recovery of writing to the page header.
page_zip_parse_write_header(): New function for applying the redo log of MLOG_ZIP_WRITE_HEADER. page_zip_parse_write_node_ptr(): Mark the log corrupted if !page_zip.
This commit is contained in:
parent
684651ce2e
commit
817ca61f77
3 changed files with 70 additions and 2 deletions
|
@ -232,6 +232,18 @@ page_zip_dir_add_slot(
|
||||||
zero for others */
|
zero for others */
|
||||||
__attribute__((nonnull));
|
__attribute__((nonnull));
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
Parses a log record of writing to the header of a page. */
|
||||||
|
|
||||||
|
byte*
|
||||||
|
page_zip_parse_write_header(
|
||||||
|
/*========================*/
|
||||||
|
/* out: end of log record or NULL */
|
||||||
|
byte* ptr, /* in: redo log buffer */
|
||||||
|
byte* end_ptr,/* in: redo log buffer end */
|
||||||
|
page_t* page, /* in/out: uncompressed page */
|
||||||
|
page_zip_des_t* page_zip);/* in/out: compressed page */
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Write data to the uncompressed header portion of a page. The data must
|
Write data to the uncompressed header portion of a page. The data must
|
||||||
already have been written to the uncompressed page.
|
already have been written to the uncompressed page.
|
||||||
|
|
|
@ -898,7 +898,8 @@ recv_parse_or_apply_log_rec_body(
|
||||||
ptr, end_ptr, page, page_zip);
|
ptr, end_ptr, page, page_zip);
|
||||||
break;
|
break;
|
||||||
case MLOG_ZIP_WRITE_HEADER:
|
case MLOG_ZIP_WRITE_HEADER:
|
||||||
ut_error; /* TODO */
|
ptr = page_zip_parse_write_header(
|
||||||
|
ptr, end_ptr, page, page_zip);
|
||||||
break;
|
break;
|
||||||
case MLOG_ZIP_COMPRESS:
|
case MLOG_ZIP_COMPRESS:
|
||||||
if (NULL != (ptr = mlog_parse_index(
|
if (NULL != (ptr = mlog_parse_index(
|
||||||
|
|
|
@ -2248,7 +2248,8 @@ page_zip_parse_write_node_ptr(
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(offset < PAGE_ZIP_START)
|
if (UNIV_UNLIKELY(offset < PAGE_ZIP_START)
|
||||||
|| UNIV_UNLIKELY(offset >= UNIV_PAGE_SIZE)
|
|| UNIV_UNLIKELY(offset >= UNIV_PAGE_SIZE)
|
||||||
|| UNIV_UNLIKELY(z_offset >= UNIV_PAGE_SIZE)) {
|
|| UNIV_UNLIKELY(z_offset >= UNIV_PAGE_SIZE)
|
||||||
|
|| UNIV_UNLIKELY(!page_zip)) {
|
||||||
corrupt:
|
corrupt:
|
||||||
recv_sys->found_corrupt_log = TRUE;
|
recv_sys->found_corrupt_log = TRUE;
|
||||||
|
|
||||||
|
@ -2712,6 +2713,60 @@ page_zip_dir_add_slot(
|
||||||
memmove(stored - PAGE_ZIP_DIR_SLOT_SIZE, stored, dir - stored);
|
memmove(stored - PAGE_ZIP_DIR_SLOT_SIZE, stored, dir - stored);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
Parses a log record of writing to the header of a page. */
|
||||||
|
|
||||||
|
byte*
|
||||||
|
page_zip_parse_write_header(
|
||||||
|
/*========================*/
|
||||||
|
/* out: end of log record or NULL */
|
||||||
|
byte* ptr, /* in: redo log buffer */
|
||||||
|
byte* end_ptr,/* in: redo log buffer end */
|
||||||
|
page_t* page, /* in/out: uncompressed page */
|
||||||
|
page_zip_des_t* page_zip)/* in/out: compressed page */
|
||||||
|
{
|
||||||
|
ulint offset;
|
||||||
|
ulint len;
|
||||||
|
|
||||||
|
ut_ad(!page == !page_zip);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(end_ptr < ptr + (2 + 1))) {
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = mach_read_from_2(ptr);
|
||||||
|
ptr += 2;
|
||||||
|
len = (ulint) *ptr++;
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!len) || UNIV_UNLIKELY(offset + len >= PAGE_DATA)
|
||||||
|
|| UNIV_UNLIKELY(!page_zip)) {
|
||||||
|
recv_sys->found_corrupt_log = TRUE;
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(end_ptr < ptr + len)) {
|
||||||
|
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page) {
|
||||||
|
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
||||||
|
ut_a(page_zip_validate(page_zip, page));
|
||||||
|
#endif /* UNIV_DEBUG || UNIV_ZIP_DEBUG */
|
||||||
|
|
||||||
|
memcpy(page + offset, ptr, len);
|
||||||
|
memcpy(page_zip->data + offset, ptr, len);
|
||||||
|
|
||||||
|
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
||||||
|
ut_a(page_zip_validate(page_zip, page));
|
||||||
|
#endif /* UNIV_DEBUG || UNIV_ZIP_DEBUG */
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ptr + len);
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Write a log record of writing to the uncompressed header portion of a page. */
|
Write a log record of writing to the uncompressed header portion of a page. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue