summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-07-02 21:44:58 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2019-07-02 21:44:58 +0300
commit7a3d34d6456ed719da62a896e5ac6e983b72f3d8 (patch)
tree38dc1133cd53a366e7a851cfba6dad1269dcd5a1 /extra
parentfaeaf978b8c1deaa61d7d408fa6cb4ed03bfcfa3 (diff)
parent1d45b3b055511d58c1e820ad497793f30871586e (diff)
downloadmariadb-git-7a3d34d6456ed719da62a896e5ac6e983b72f3d8.tar.gz
Merge 10.3 into 10.4
Diffstat (limited to 'extra')
-rw-r--r--extra/innochecksum.cc91
-rw-r--r--extra/mariabackup/xtrabackup.cc2
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);