Skip to content

Commit c5fe1b8

Browse files
MDEV-16866 InnoDB fails to start upon crash recovery with "[ERROR] InnoDB: Redo log crypto: failed to decrypt log block"
- If InnoDB encounters garbage or incomplete written log block during recovery then don't throw the error. Treat it as end of the log. - This kind of incomplete or empty block can be result of killing InnoDB when writing the redo log.
1 parent e7695f9 commit c5fe1b8

File tree

2 files changed

+38
-39
lines changed

2 files changed

+38
-39
lines changed

storage/innobase/log/log0recv.cc

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2631,30 +2631,30 @@ recv_scan_log_recs(
26312631
fprintf(stderr, "Scanned lsn no %lu\n",
26322632
log_block_convert_lsn_to_no(scanned_lsn));
26332633
*/
2634-
if (no != log_block_convert_lsn_to_no(scanned_lsn)
2635-
|| !log_block_checksum_is_ok_or_old_format(log_block, true)) {
2634+
if (no != log_block_convert_lsn_to_no(scanned_lsn)) {
2635+
/* Garbage or an incompletely written log block.
2636+
We will not report any error; because this can happen
2637+
when InnoDB was killed while it was writing
2638+
redo log. We simply treat this as an abrupt end of the
2639+
redo log. */
2640+
finished = true;
2641+
break;
2642+
} else if (!log_block_checksum_is_ok_or_old_format(
2643+
log_block, true)) {
26362644

2637-
if (no == log_block_convert_lsn_to_no(scanned_lsn)
2638-
&& !log_block_checksum_is_ok_or_old_format(
2639-
log_block, true)) {
2640-
fprintf(stderr,
2641-
"InnoDB: Log block no %lu at"
2642-
" lsn " LSN_PF " has\n"
2643-
"InnoDB: ok header, but checksum field"
2644-
" contains %lu, should be %lu\n",
2645-
(ulong) no,
2646-
scanned_lsn,
2647-
(ulong) log_block_get_checksum(
2648-
log_block),
2649-
(ulong) log_block_calc_checksum(
2650-
log_block));
2651-
}
2645+
fprintf(stderr,
2646+
"InnoDB: Log block no %lu at"
2647+
" lsn " LSN_PF " has\n"
2648+
"InnoDB: ok header, but checksum field"
2649+
" contains %lu, should be %lu\n",
2650+
(ulong) no,
2651+
scanned_lsn,
2652+
(ulong) log_block_get_checksum(log_block),
2653+
(ulong) log_block_calc_checksum(log_block));
26522654

26532655
maybe_encrypted = log_crypt_block_maybe_encrypted(log_block,
26542656
&log_crypt_err);
26552657

2656-
/* Garbage or an incompletely written log block */
2657-
26582658
/* Print checkpoint encryption keys if present */
26592659
log_crypt_print_checkpoint_keys(log_block);
26602660
finished = TRUE;

storage/xtradb/log/log0recv.cc

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2720,30 +2720,30 @@ recv_scan_log_recs(
27202720
log_block_convert_lsn_to_no(scanned_lsn));
27212721
*/
27222722

2723-
if (no != log_block_convert_lsn_to_no(scanned_lsn)
2724-
|| !log_block_checksum_is_ok_or_old_format(log_block, true)) {
2723+
if (no != log_block_convert_lsn_to_no(scanned_lsn)) {
2724+
/* Garbage or an incompletely written log block.
2725+
We will not report any error; because this can happen
2726+
when InnoDB was killed while it was writing
2727+
redo log. We simply treat this as an abrupt end of the
2728+
redo log. */
2729+
finished = true;
2730+
break;
2731+
} else if (!log_block_checksum_is_ok_or_old_format(
2732+
log_block, true)) {
27252733

2726-
if (no == log_block_convert_lsn_to_no(scanned_lsn)
2727-
&& !log_block_checksum_is_ok_or_old_format(
2728-
log_block, true)) {
2729-
fprintf(stderr,
2730-
"InnoDB: Log block no %lu at"
2731-
" lsn " LSN_PF " has\n"
2732-
"InnoDB: ok header, but checksum field"
2733-
" contains %lu, should be %lu\n",
2734-
(ulong) no,
2735-
scanned_lsn,
2736-
(ulong) log_block_get_checksum(
2737-
log_block),
2738-
(ulong) log_block_calc_checksum(
2739-
log_block));
2740-
}
2734+
fprintf(stderr,
2735+
"InnoDB: Log block no %lu at"
2736+
" lsn " LSN_PF " has\n"
2737+
"InnoDB: ok header, but checksum field"
2738+
" contains %lu, should be %lu\n",
2739+
(ulong) no,
2740+
scanned_lsn,
2741+
(ulong) log_block_get_checksum(log_block),
2742+
(ulong) log_block_calc_checksum(log_block));
27412743

27422744
maybe_encrypted = log_crypt_block_maybe_encrypted(log_block,
27432745
&log_crypt_err);
27442746

2745-
/* Garbage or an incompletely written log block */
2746-
27472747
/* Print checkpoint encryption keys if present */
27482748
log_crypt_print_checkpoint_keys(log_block);
27492749
finished = TRUE;
@@ -2764,7 +2764,6 @@ recv_scan_log_recs(
27642764
}
27652765

27662766
break;
2767-
27682767
}
27692768

27702769
if (log_block_get_flush_bit(log_block)) {

0 commit comments

Comments
 (0)