mirror of
https://github.com/MariaDB/server.git
synced 2025-07-25 16:39:52 +00:00
MDEV-20688 Recovery crashes after unnecessarily reading a corrupted page
The test encryption.innodb-redo-badkey was accidentally disabled
until commit 23657a2101
enabled
it recently. Once it was enabled, it started failing randomly.
recv_recover_corrupt_page(): Do not assume that any redo log exists
for the page. A page may be unnecessarily read by read-ahead.
When noting the corruption, reset recv_addr->state to RECV_PROCESSED,
so that even if the same page is re-read again, we will only
decrement recv_sys->n_addrs once.
This commit is contained in:

committed by
Marko Mäkelä

parent
d874cdeccc
commit
c76873f23d
@ -1,9 +1,10 @@
|
|||||||
call mtr.add_suppression("Plugin 'file_key_management'");
|
call mtr.add_suppression("Plugin 'file_key_management'");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
|
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
|
||||||
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted");
|
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test/t[1-4]\\.ibd' cannot be decrypted");
|
||||||
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
|
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
|
||||||
call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
|
call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t[12]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
|
||||||
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
|
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[12] page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
|
||||||
|
call mtr.add_suppression("InnoDB: Failed to read file '.*' at offset .*");
|
||||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
||||||
# Restart mysqld --file-key-management-filename=keys2.txt
|
# Restart mysqld --file-key-management-filename=keys2.txt
|
||||||
|
@ -5,10 +5,11 @@
|
|||||||
|
|
||||||
call mtr.add_suppression("Plugin 'file_key_management'");
|
call mtr.add_suppression("Plugin 'file_key_management'");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
|
call mtr.add_suppression("Plugin 'InnoDB' init function returned error.");
|
||||||
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file .*test/t[1-4]\\.ibd cannot be decrypted");
|
call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test/t[1-4]\\.ibd' cannot be decrypted");
|
||||||
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
|
call mtr.add_suppression("failed to read or decrypt \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\]");
|
||||||
call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t1\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
|
call mtr.add_suppression("InnoDB: Unable to decompress .*.test.t[12]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]");
|
||||||
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t1 page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
|
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[12] page \\[page id: space=[1-9][0-9]*, page number=[0-9]*\\]");
|
||||||
|
call mtr.add_suppression("InnoDB: Failed to read file '.*' at offset .*");
|
||||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
||||||
|
|
||||||
|
@ -2221,18 +2221,20 @@ void recv_recover_corrupt_page(page_id_t page_id)
|
|||||||
mutex_enter(&recv_sys->mutex);
|
mutex_enter(&recv_sys->mutex);
|
||||||
|
|
||||||
if (!recv_sys->apply_log_recs) {
|
if (!recv_sys->apply_log_recs) {
|
||||||
mutex_exit(&recv_sys->mutex);
|
} else if (recv_addr_t* recv_addr = recv_get_fil_addr_struct(
|
||||||
return;
|
page_id.space(), page_id.page_no())) {
|
||||||
}
|
switch (recv_addr->state) {
|
||||||
|
case RECV_WILL_NOT_READ:
|
||||||
recv_addr_t* recv_addr = recv_get_fil_addr_struct(
|
ut_ad(!"wrong state");
|
||||||
page_id.space(), page_id.page_no());
|
break;
|
||||||
|
case RECV_BEING_PROCESSED:
|
||||||
ut_ad(recv_addr->state != RECV_WILL_NOT_READ);
|
case RECV_PROCESSED:
|
||||||
|
break;
|
||||||
if (recv_addr->state != RECV_BEING_PROCESSED
|
default:
|
||||||
&& recv_addr->state != RECV_PROCESSED) {
|
recv_addr->state = RECV_PROCESSED;
|
||||||
recv_sys->n_addrs--;
|
ut_ad(recv_sys->n_addrs);
|
||||||
|
recv_sys->n_addrs--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_exit(&recv_sys->mutex);
|
mutex_exit(&recv_sys->mutex);
|
||||||
|
Reference in New Issue
Block a user