diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-03-13 07:20:36 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-03-13 07:20:36 +0200 |
commit | 32904dc5fac36bffeacc75512f0444c8817a39ce (patch) | |
tree | ad5809c25e6d0e577d6433a67482735262328c5f /storage/innobase/page | |
parent | 5257bcfc7afad9068ccb7f5f1777c03aa5bedb12 (diff) | |
parent | 7b082fb099348da664cf9b35f75eab54deba3b29 (diff) | |
download | mariadb-git-32904dc5fac36bffeacc75512f0444c8817a39ce.tar.gz |
Merge 10.1 into 10.2
Diffstat (limited to 'storage/innobase/page')
-rw-r--r-- | storage/innobase/page/page0zip.cc | 65 |
1 files changed, 17 insertions, 48 deletions
diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index aec6bcc38da..6a86ad6be23 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -4986,60 +4986,30 @@ page_zip_calc_checksum( return(0); } -/**********************************************************************//** -Verify a compressed page's checksum. -@return TRUE if the stored checksum is valid according to the value of -innodb_checksum_algorithm */ -ibool -page_zip_verify_checksum( -/*=====================*/ - const void* data, /*!< in: compressed page */ - ulint size) /*!< in: size of compressed page */ +/** Validate the checksum on a ROW_FORMAT=COMPRESSED page. +@param data ROW_FORMAT=COMPRESSED page +@param size size of the page, in bytes +@return whether the stored checksum matches innodb_checksum_algorithm */ +bool page_zip_verify_checksum(const void *data, size_t size) { - const uint32_t stored = mach_read_from_4( - static_cast<const byte*>(data) + FIL_PAGE_SPACE_OR_CHKSUM); + const srv_checksum_algorithm_t curr_algo = + static_cast<srv_checksum_algorithm_t>(srv_checksum_algorithm); -#if FIL_PAGE_LSN % 8 -#error "FIL_PAGE_LSN must be 64 bit aligned" -#endif + if (curr_algo == SRV_CHECKSUM_ALGORITHM_NONE) { + return true; + } - /* Check if page is empty */ - if (stored == 0 - && *reinterpret_cast<const ib_uint64_t*>(static_cast<const char*>( - data) - + FIL_PAGE_LSN) == 0) { - /* make sure that the page is really empty */ -#ifdef UNIV_INNOCHECKSUM - ulint i; - for (i = 0; i < size; i++) { - if (*((const char*) data + i) != 0) - break; + for (size_t i = 0; i < size; i++) { + if (static_cast<const byte*>(data)[i] != 0) { + goto not_all_zeroes; } - if (i >= size) { - if (log_file) { - fprintf(log_file, "Page::%llu is empty and" - " uncorrupted\n", cur_page_num); - } - - return(TRUE); - } -#else - for (ulint i = 0; i < size; i++) { - if (*((const char*) data + i) != 0) { - return(FALSE); - } - } - /* Empty page */ - return(TRUE); -#endif /* UNIV_INNOCHECKSUM */ } - const srv_checksum_algorithm_t curr_algo = - static_cast<srv_checksum_algorithm_t>(srv_checksum_algorithm); + return true; - if (curr_algo == SRV_CHECKSUM_ALGORITHM_NONE) { - return(TRUE); - } +not_all_zeroes: + const uint32_t stored = mach_read_from_4( + static_cast<const byte*>(data) + FIL_PAGE_SPACE_OR_CHKSUM); uint32_t calc = page_zip_calc_checksum(data, size, curr_algo); @@ -5055,7 +5025,6 @@ page_zip_verify_checksum( } if (!strict_verify) { - const uint32_t crc32 = page_zip_calc_checksum( data, size, SRV_CHECKSUM_ALGORITHM_CRC32); |