summaryrefslogtreecommitdiff
path: root/extra/mariabackup/fil_cur.cc
diff options
context:
space:
mode:
Diffstat (limited to 'extra/mariabackup/fil_cur.cc')
-rw-r--r--extra/mariabackup/fil_cur.cc41
1 files changed, 31 insertions, 10 deletions
diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc
index b229a37d934..843bceae3c6 100644
--- a/extra/mariabackup/fil_cur.cc
+++ b/extra/mariabackup/fil_cur.cc
@@ -36,6 +36,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "read_filt.h"
#include "xtrabackup.h"
#include "xb0xb.h"
+#include "backup_debug.h"
/* Size of read buffer in pages (640 pages = 10M for 16K sized pages) */
#define XB_FIL_CUR_PAGES 640
@@ -381,8 +382,8 @@ if there are no more pages to read and XB_FIL_CUR_ERROR on error. */
xb_fil_cur_result_t
xb_fil_cur_read(
/*============*/
- xb_fil_cur_t* cursor) /*!< in/out: source file cursor */
-{
+ xb_fil_cur_t* cursor, /*!< in/out: source file cursor */
+ CorruptedPages &corrupted_pages){
byte* page;
ulint i;
ulint npages;
@@ -455,20 +456,40 @@ read_retry:
retry_count--;
if (retry_count == 0) {
+ const char *ignore_corruption_warn = opt_log_innodb_page_corruption ?
+ " WARNING!!! The corruption is ignored due to"
+ " log-innodb-page-corruption option, the backup can contain"
+ " corrupted data." : "";
msg(cursor->thread_n,
"Error: failed to read page after "
"10 retries. File %s seems to be "
- "corrupted.", cursor->abs_path);
- ret = XB_FIL_CUR_ERROR;
+ "corrupted.%s", cursor->abs_path, ignore_corruption_warn);
buf_page_print(page, cursor->page_size);
- break;
+ if (opt_log_innodb_page_corruption) {
+ corrupted_pages.add_page(cursor->node->name, cursor->node->space->id,
+ page_no);
+ retry_count = 1;
+ }
+ else {
+ ret = XB_FIL_CUR_ERROR;
+ break;
+ }
+ }
+ else {
+ msg(cursor->thread_n, "Database page corruption detected at page "
+ ULINTPF ", retrying...",
+ page_no);
+ os_thread_sleep(100000);
+ goto read_retry;
}
- msg(cursor->thread_n, "Database page corruption detected at page "
- ULINTPF ", retrying...",
- page_no);
- os_thread_sleep(100000);
- goto read_retry;
}
+ DBUG_EXECUTE_FOR_KEY("add_corrupted_page_for", cursor->node->space->name,
+ {
+ ulint corrupted_page_no = strtoul(dbug_val, NULL, 10);
+ if (page_no == corrupted_page_no)
+ corrupted_pages.add_page(cursor->node->name, cursor->node->space->id,
+ corrupted_page_no);
+ });
cursor->buf_read += page_size;
cursor->buf_npages++;
}