mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Revert of marko.makela@oracle.com-20130430103950-j353faze84zzk9xf for xtradb
(fix of http://bugs.mysql.com/bug.php?id=69623)
This commit is contained in:
parent
66ec79fc87
commit
c7973615e7
6 changed files with 24 additions and 136 deletions
|
@ -581,8 +581,6 @@ UNIV_INTERN
|
|||
ibool
|
||||
buf_page_is_corrupted(
|
||||
/*==================*/
|
||||
ibool check_lsn, /*!< in: TRUE if we need to check
|
||||
and complain about the LSN */
|
||||
const byte* read_buf, /*!< in: a database page */
|
||||
ulint zip_size) /*!< in: size of compressed page;
|
||||
0 for uncompressed pages */
|
||||
|
@ -602,7 +600,7 @@ buf_page_is_corrupted(
|
|||
}
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
if (check_lsn && recv_lsn_checks_on) {
|
||||
if (recv_lsn_checks_on) {
|
||||
ib_uint64_t current_lsn;
|
||||
|
||||
if (log_peek_lsn(¤t_lsn)
|
||||
|
@ -3947,7 +3945,7 @@ buf_page_io_complete(
|
|||
/* From version 3.23.38 up we store the page checksum
|
||||
to the 4 first bytes of the page end lsn field */
|
||||
|
||||
if (buf_page_is_corrupted(TRUE, frame,
|
||||
if (buf_page_is_corrupted(frame,
|
||||
buf_page_get_zip_size(bpage))) {
|
||||
corrupt:
|
||||
fprintf(stderr,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -1883,63 +1883,11 @@ fil_write_flushed_lsn_to_data_files(
|
|||
return(DB_SUCCESS);
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
Checks the consistency of the first data page of a data file
|
||||
at database startup.
|
||||
@retval NULL on success, or if innodb_force_recovery is set
|
||||
@return pointer to an error message string */
|
||||
static __attribute__((warn_unused_result))
|
||||
const char*
|
||||
fil_check_first_page(
|
||||
/*=================*/
|
||||
const page_t* page, /*!< in: data page */
|
||||
ibool first_page) /*!< in: TRUE if this is the
|
||||
first page of the tablespace */
|
||||
{
|
||||
ulint space_id;
|
||||
ulint flags;
|
||||
|
||||
if (srv_force_recovery >= SRV_FORCE_IGNORE_CORRUPT) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
space_id = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_ID + page);
|
||||
flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page);
|
||||
|
||||
if (first_page && !space_id && !flags) {
|
||||
ulint nonzero_bytes = UNIV_PAGE_SIZE;
|
||||
const byte* b = page;
|
||||
|
||||
while (!*b && --nonzero_bytes) {
|
||||
b++;
|
||||
}
|
||||
|
||||
if (!nonzero_bytes) {
|
||||
return("space header page consists of zero bytes");
|
||||
}
|
||||
}
|
||||
|
||||
if (buf_page_is_corrupted(
|
||||
FALSE, page, dict_table_flags_to_zip_size(flags))) {
|
||||
return("checksum mismatch");
|
||||
}
|
||||
|
||||
if (!first_page
|
||||
|| (page_get_space_id(page) == space_id
|
||||
&& page_get_page_no(page) == 0)) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
return("inconsistent data in space header");
|
||||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
Reads the flushed lsn, arch no, and tablespace flag fields from a data
|
||||
file at database startup.
|
||||
@retval NULL on success, or if innodb_force_recovery is set
|
||||
@return pointer to an error message string */
|
||||
file at database startup. */
|
||||
UNIV_INTERN
|
||||
const char*
|
||||
void
|
||||
fil_read_first_page(
|
||||
/*================*/
|
||||
os_file_t data_file, /*!< in: open data file */
|
||||
|
@ -1961,7 +1909,6 @@ fil_read_first_page(
|
|||
byte* buf;
|
||||
page_t* page;
|
||||
ib_uint64_t flushed_lsn;
|
||||
const char* check_msg;
|
||||
|
||||
buf = ut_malloc(2 * UNIV_PAGE_SIZE);
|
||||
/* Align the memory for a possible read from a raw device */
|
||||
|
@ -1969,18 +1916,13 @@ fil_read_first_page(
|
|||
|
||||
os_file_read(data_file, page, 0, 0, UNIV_PAGE_SIZE);
|
||||
|
||||
*flags = mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page);
|
||||
*flags = mach_read_from_4(page +
|
||||
FSP_HEADER_OFFSET + FSP_SPACE_FLAGS);
|
||||
|
||||
flushed_lsn = mach_read_from_8(page + FIL_PAGE_FILE_FLUSH_LSN);
|
||||
|
||||
check_msg = fil_check_first_page(page, !one_read_already);
|
||||
|
||||
ut_free(buf);
|
||||
|
||||
if (check_msg) {
|
||||
return(check_msg);
|
||||
}
|
||||
|
||||
if (!one_read_already) {
|
||||
*min_flushed_lsn = flushed_lsn;
|
||||
*max_flushed_lsn = flushed_lsn;
|
||||
|
@ -1988,7 +1930,7 @@ fil_read_first_page(
|
|||
*min_arch_log_no = arch_log_no;
|
||||
*max_arch_log_no = arch_log_no;
|
||||
#endif /* UNIV_LOG_ARCHIVE */
|
||||
return(NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
if (*min_flushed_lsn > flushed_lsn) {
|
||||
|
@ -2005,8 +1947,6 @@ fil_read_first_page(
|
|||
*max_arch_log_no = arch_log_no;
|
||||
}
|
||||
#endif /* UNIV_LOG_ARCHIVE */
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/*================ SINGLE-TABLE TABLESPACES ==========================*/
|
||||
|
@ -3331,7 +3271,6 @@ fil_open_single_table_tablespace(
|
|||
os_file_t file;
|
||||
char* filepath;
|
||||
ibool success;
|
||||
const char* check_msg;
|
||||
byte* buf2;
|
||||
byte* page;
|
||||
ulint space_id;
|
||||
|
@ -3392,8 +3331,6 @@ fil_open_single_table_tablespace(
|
|||
|
||||
success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE);
|
||||
|
||||
check_msg = fil_check_first_page(page, TRUE);
|
||||
|
||||
/* We have to read the tablespace id and flags from the file. */
|
||||
|
||||
space_id = fsp_header_get_space_id(page);
|
||||
|
@ -3429,7 +3366,7 @@ fil_open_single_table_tablespace(
|
|||
current_lsn = log_get_lsn();
|
||||
|
||||
/* check the header page's consistency */
|
||||
if (buf_page_is_corrupted(TRUE, page,
|
||||
if (buf_page_is_corrupted(page,
|
||||
dict_table_flags_to_zip_size(space_flags))) {
|
||||
fprintf(stderr, "InnoDB: page 0 of %s seems corrupt.\n", filepath);
|
||||
file_is_corrupt = TRUE;
|
||||
|
@ -3851,20 +3788,8 @@ skip_write:
|
|||
|
||||
ut_free(buf2);
|
||||
|
||||
if (check_msg) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr, " InnoDB: Error: %s in file ", check_msg);
|
||||
ut_print_filename(stderr, filepath);
|
||||
fprintf(stderr, " (tablespace id=%lu, flags=%lu)\n"
|
||||
"InnoDB: Please refer to " REFMAN
|
||||
"innodb-troubleshooting-datadict.html\n",
|
||||
(ulong) id, (ulong) flags);
|
||||
success = FALSE;
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
if (space_id != id
|
||||
|| space_flags != (flags & ~(~0 << DICT_TF_BITS))) {
|
||||
if (UNIV_UNLIKELY(space_id != id
|
||||
|| space_flags != (flags & ~(~0 << DICT_TF_BITS)))) {
|
||||
ut_print_timestamp(stderr);
|
||||
|
||||
fputs(" InnoDB: Error: tablespace id and flags in file ",
|
||||
|
@ -4355,21 +4280,11 @@ fil_load_single_table_tablespace(
|
|||
page = ut_align(buf2, UNIV_PAGE_SIZE);
|
||||
|
||||
if (size >= FIL_IBD_FILE_INITIAL_SIZE * (lint)UNIV_PAGE_SIZE) {
|
||||
const char* check_msg;
|
||||
|
||||
success = os_file_read(file, page, 0, 0, UNIV_PAGE_SIZE);
|
||||
|
||||
/* We have to read the tablespace id from the file */
|
||||
|
||||
check_msg = fil_check_first_page(page, TRUE);
|
||||
|
||||
if (check_msg) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: %s in file %s",
|
||||
check_msg, filepath);
|
||||
goto func_exit;
|
||||
}
|
||||
|
||||
space_id = fsp_header_get_space_id(page);
|
||||
flags = fsp_header_get_flags(page);
|
||||
} else {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -684,12 +684,9 @@ UNIV_INTERN
|
|||
ibool
|
||||
buf_page_is_corrupted(
|
||||
/*==================*/
|
||||
ibool check_lsn, /*!< in: TRUE if we need to check
|
||||
and complain about the LSN */
|
||||
const byte* read_buf, /*!< in: a database page */
|
||||
ulint zip_size) /*!< in: size of compressed page;
|
||||
ulint zip_size); /*!< in: size of compressed page;
|
||||
0 for uncompressed pages */
|
||||
__attribute__((warn_unused_result));
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/**********************************************************************//**
|
||||
Gets the space id, page offset, and byte offset within page of a
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1995, 2010, Innobase Oy. All Rights Reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -328,12 +328,10 @@ fil_write_flushed_lsn_to_data_files(
|
|||
ulint arch_log_no); /*!< in: latest archived log
|
||||
file number */
|
||||
/*******************************************************************//**
|
||||
Reads the flushed lsn, arch no, and tablespace flag fields from a data
|
||||
file at database startup.
|
||||
@retval NULL on success, or if innodb_force_recovery is set
|
||||
@return pointer to an error message string */
|
||||
Reads the flushed lsn and arch no fields from a data file at database
|
||||
startup. */
|
||||
UNIV_INTERN
|
||||
const char*
|
||||
void
|
||||
fil_read_first_page(
|
||||
/*================*/
|
||||
os_file_t data_file, /*!< in: open data file */
|
||||
|
@ -349,9 +347,8 @@ fil_read_first_page(
|
|||
#endif /* UNIV_LOG_ARCHIVE */
|
||||
ib_uint64_t* min_flushed_lsn, /*!< out: min of flushed
|
||||
lsn values in data files */
|
||||
ib_uint64_t* max_flushed_lsn) /*!< out: max of flushed
|
||||
ib_uint64_t* max_flushed_lsn); /*!< out: max of flushed
|
||||
lsn values in data files */
|
||||
__attribute__((warn_unused_result));
|
||||
/*******************************************************************//**
|
||||
Increments the count of pending operation, if space is not being deleted.
|
||||
@return TRUE if being deleted, and operation should be skipped */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 1996, 2010, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
Copyright (c) 2009, Percona Inc.
|
||||
|
||||
|
@ -817,7 +817,6 @@ open_or_create_data_files(
|
|||
}
|
||||
|
||||
if (ret == FALSE) {
|
||||
const char* check_msg;
|
||||
/* We open the data file */
|
||||
|
||||
if (one_created) {
|
||||
|
@ -915,20 +914,13 @@ open_or_create_data_files(
|
|||
return(DB_ERROR);
|
||||
}
|
||||
skip_size_check:
|
||||
check_msg = fil_read_first_page(
|
||||
fil_read_first_page(
|
||||
files[i], one_opened, &flags,
|
||||
#ifdef UNIV_LOG_ARCHIVE
|
||||
min_arch_log_no, max_arch_log_no,
|
||||
#endif /* UNIV_LOG_ARCHIVE */
|
||||
min_flushed_lsn, max_flushed_lsn);
|
||||
|
||||
if (check_msg) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: %s in data file %s\n",
|
||||
check_msg, name);
|
||||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
if (!one_opened
|
||||
&& UNIV_PAGE_SIZE
|
||||
!= fsp_flags_get_page_size(flags)) {
|
||||
|
@ -1050,8 +1042,6 @@ skip_size_check:
|
|||
|
||||
if (ret == FALSE) {
|
||||
|
||||
const char* check_msg;
|
||||
|
||||
/* We open the data file */
|
||||
|
||||
files[i] = os_file_create(innodb_file_data_key,
|
||||
|
@ -1088,20 +1078,13 @@ skip_size_check:
|
|||
(ulong) TRX_SYS_DOUBLEWRITE_BLOCK_SIZE * 9);
|
||||
}
|
||||
|
||||
check_msg = fil_read_first_page(
|
||||
fil_read_first_page(
|
||||
files[i], one_opened, &flags,
|
||||
#ifdef UNIV_LOG_ARCHIVE
|
||||
min_arch_log_no, max_arch_log_no,
|
||||
#endif /* UNIV_LOG_ARCHIVE */
|
||||
min_flushed_lsn, max_flushed_lsn);
|
||||
|
||||
if (check_msg) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: %s in doublewrite "
|
||||
"buffer file %s\n", check_msg, name);
|
||||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
one_opened = TRUE;
|
||||
} else {
|
||||
/* We created the data file and now write it full of
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2013, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -726,8 +726,7 @@ trx_sys_doublewrite_init_or_restore_pages(
|
|||
/* Check if the page is corrupt */
|
||||
|
||||
if (UNIV_UNLIKELY
|
||||
(buf_page_is_corrupted(
|
||||
TRUE, read_buf, zip_size))) {
|
||||
(buf_page_is_corrupted(read_buf, zip_size))) {
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Warning: database page"
|
||||
|
@ -738,8 +737,7 @@ trx_sys_doublewrite_init_or_restore_pages(
|
|||
" the doublewrite buffer.\n",
|
||||
(ulong) space_id, (ulong) page_no);
|
||||
|
||||
if (buf_page_is_corrupted(
|
||||
TRUE, page, zip_size)) {
|
||||
if (buf_page_is_corrupted(page, zip_size)) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Dump of the page:\n");
|
||||
buf_page_print(
|
||||
|
|
Loading…
Reference in a new issue