summaryrefslogtreecommitdiff
path: root/extra
diff options
context:
space:
mode:
authorVlad Lesin <vlad_lesin@mail.ru>2020-09-19 00:08:38 +0300
committerVlad Lesin <vlad_lesin@mail.ru>2020-09-21 12:29:52 +0300
commit0a224edc3e24b28a3b2abcd3538a3d7d63d667c6 (patch)
tree58867a9e909a10fd05b7b619e1e5161fb45ede3c /extra
parent69d536a22dc1988e89697c55549fc3c272fbbf2c (diff)
downloadmariadb-git-0a224edc3e24b28a3b2abcd3538a3d7d63d667c6.tar.gz
MDEV-23711 make mariabackup innodb redo log read error message more clear
log_group_read_log_seg() returns error when: 1) Calculated log block number does not correspond to read log block number. This can be caused by: a) Garbage or an incompletely written log block. We can exclude this case by checking log block checksum if it's enabled(see innodb-log-checksums, encrypted log block contains checksum always). b) The log block is overwritten. In this case checksum will be correct and read log block number will be greater then requested one. 2) When log block length is wrong. In this case recv_sys->found_corrupt_log is set. 3) When redo log block checksum is wrong. In this case innodb code writes messages to error log with the following prefix: "Invalid log block checksum." The fix processes all the cases above.
Diffstat (limited to 'extra')
-rw-r--r--extra/mariabackup/xtrabackup.cc19
1 files changed, 16 insertions, 3 deletions
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 4845f51e6b2..231e3c04f16 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -2773,6 +2773,7 @@ static bool xtrabackup_copy_logfile(bool last = false)
ut_a(dst_log_file != NULL);
ut_ad(recv_sys != NULL);
+ bool overwritten_block;
lsn_t start_lsn;
lsn_t end_lsn;
@@ -2799,6 +2800,12 @@ static bool xtrabackup_copy_logfile(bool last = false)
}
if (lsn == start_lsn) {
+ overwritten_block= !recv_sys->found_corrupt_log
+ && (innodb_log_checksums || log_sys->log.is_encrypted())
+ && log_block_calc_checksum_crc32(log_sys->buf) ==
+ log_block_get_checksum(log_sys->buf)
+ && log_block_get_hdr_no(log_sys->buf) >
+ log_block_convert_lsn_to_no(start_lsn);
start_lsn = 0;
} else {
mutex_enter(&recv_sys->mutex);
@@ -2809,9 +2816,15 @@ static bool xtrabackup_copy_logfile(bool last = false)
log_mutex_exit();
if (!start_lsn) {
- die(recv_sys->found_corrupt_log
- ? "xtrabackup_copy_logfile() failed: corrupt log."
- : "xtrabackup_copy_logfile() failed.");
+ const char *reason = recv_sys->found_corrupt_log
+ ? "corrupt log."
+ : (overwritten_block
+ ? "redo log block is overwritten, please increase redo log size with innodb_log_file_size parameter."
+ : ((innodb_log_checksums || log_sys->log.is_encrypted())
+ ? "redo log block checksum does not match."
+ : "unknown reason as innodb_log_checksums is switched off and redo"
+ " log is not encrypted."));
+ die("xtrabackup_copy_logfile() failed: %s", reason);
return true;
}
} while (start_lsn == end_lsn);