diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-07-02 21:44:58 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-07-02 21:44:58 +0300 |
commit | 7a3d34d6456ed719da62a896e5ac6e983b72f3d8 (patch) | |
tree | 38dc1133cd53a366e7a851cfba6dad1269dcd5a1 /extra | |
parent | faeaf978b8c1deaa61d7d408fa6cb4ed03bfcfa3 (diff) | |
parent | 1d45b3b055511d58c1e820ad497793f30871586e (diff) | |
download | mariadb-git-7a3d34d6456ed719da62a896e5ac6e983b72f3d8.tar.gz |
Merge 10.3 into 10.4
Diffstat (limited to 'extra')
-rw-r--r-- | extra/innochecksum.cc | 91 | ||||
-rw-r--r-- | extra/mariabackup/xtrabackup.cc | 2 |
2 files changed, 84 insertions, 9 deletions
diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 0b970ed022d..753ded46041 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -75,6 +75,8 @@ ulong srv_page_size; ulong srv_page_size_shift; /* Current page number (0 based). */ unsigned long long cur_page_num; +/* Current space. */ +unsigned long long cur_space; /* Skip the checksum verification. */ static bool no_check; /* Enabled for strict checksum verification. */ @@ -282,7 +284,9 @@ static void init_page_size(const byte* buf) + FSP_SPACE_FLAGS); if (fil_space_t::full_crc32(flags)) { - srv_page_size = fil_space_t::logical_size(flags); + const ulong ssize = FSP_FLAGS_FCRC32_GET_PAGE_SSIZE(flags); + srv_page_size_shift = UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize; + srv_page_size = 512U << ssize; physical_page_size = srv_page_size; return; } @@ -424,6 +428,27 @@ ulint read_file( return bytes; } +/** Check whether the page contains all zeroes. +@param[in] buf page +@param[in] size physical size of the page +@return true if the page is all zeroes; else false */ +static bool is_page_all_zeroes( + byte* buf, + ulint size) +{ + /* On pages that are not all zero, the page number + must match. */ + const ulint* p = reinterpret_cast<const ulint*>(buf); + const ulint* const end = reinterpret_cast<const ulint*>(buf + size); + do { + if (*p++) { + return false; + } + } while (p != end); + + return true; +} + /** Check if page is corrupted or not. @param[in] buf page frame @param[in] is_encrypted true if page0 contained cryp_data @@ -451,6 +476,26 @@ is_page_corrupted( ulint is_compressed = fil_space_t::is_compressed(flags); const bool use_full_crc32 = fil_space_t::full_crc32(flags); + if (mach_read_from_4(buf + FIL_PAGE_OFFSET) != cur_page_num + || (space_id != cur_space + && (!use_full_crc32 || (!is_encrypted && !is_compressed)))) { + /* On pages that are not all zero, the page number + must match. */ + if (is_page_all_zeroes(buf, + fil_space_t::physical_size(flags))) { + return false; + } + + if (is_log_enabled) { + fprintf(log_file, + "page id mismatch space::" ULINTPF + " page::%llu \n", + space_id, cur_page_num); + } + + return true; + } + /* We can't trust only a page type, thus we take account also fsp_flags or crypt_data on page 0 */ if ((page_type == FIL_PAGE_PAGE_COMPRESSED && is_compressed) || @@ -1539,9 +1584,6 @@ int main( FILE* fil_page_type = NULL; fpos_t pos; - /* Use to check the space id of given file. If space_id is zero, - then check whether page is doublewrite buffer.*/ - ulint space_id = 0UL; /* enable when space_id of given file is zero. */ bool is_system_tablespace = false; @@ -1663,9 +1705,8 @@ int main( /* enable variable is_system_tablespace when space_id of given file is zero. Use to skip the checksum verification and rewrite for doublewrite pages. */ - is_system_tablespace = (!memcmp(&space_id, buf + - FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 4)) - ? true : false; + cur_space = mach_read_from_4(buf + FIL_PAGE_SPACE_ID); + cur_page_num = mach_read_from_4(buf + FIL_PAGE_OFFSET); /* Determine page size, zip_size and page compression from fsp_flags and encryption metadata from page 0 */ @@ -1673,7 +1714,9 @@ int main( ulint flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + buf); - if (physical_page_size > UNIV_ZIP_SIZE_MIN) { + if (physical_page_size == UNIV_ZIP_SIZE_MIN) { + partial_page_read = false; + } else { /* Read rest of the page 0 to determine crypt_data */ bytes = read_file(buf, partial_page_read, physical_page_size, fil_in); if (bytes != physical_page_size) { @@ -1688,6 +1731,7 @@ int main( partial_page_read = false; } + /* Now that we have full page 0 in buffer, check encryption */ bool is_encrypted = check_encryption(filename, buf); @@ -1764,6 +1808,36 @@ int main( } } + off_t cur_offset = 0; + /* Find the first non all-zero page and fetch the + space id from there. */ + while (is_page_all_zeroes(buf, physical_page_size)) { + bytes = ulong(read_file( + buf, false, physical_page_size, + fil_in)); + + if (feof(fil_in)) { + fprintf(stderr, "All are " + "zero-filled pages."); + goto my_exit; + } + + cur_offset++; + } + + cur_space = mach_read_from_4(buf + FIL_PAGE_SPACE_ID); + is_system_tablespace = (cur_space == 0); + + if (cur_offset > 0) { + /* Re-read the non-zero page to check the + checksum. So move the file pointer to + previous position and reset the page number too. */ + cur_page_num = mach_read_from_4(buf + FIL_PAGE_OFFSET); + if (!start_page) { + goto first_non_zero; + } + } + /* seek to the necessary position */ if (start_page) { if (!read_from_stdin) { @@ -1856,6 +1930,7 @@ int main( goto my_exit; } +first_non_zero: if (is_system_tablespace) { /* enable when page is double write buffer.*/ skip_page = is_page_doublewritebuffer(buf); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index f0388048cdd..1d34a8cda4f 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -3810,7 +3810,7 @@ open_or_create_log_file( fil_space_t* space, ulint i) /*!< in: log file number in group */ { - char name[10000]; + char name[FN_REFLEN]; ulint dirnamelen; os_normalize_path(srv_log_group_home_dir); |