Commit b3939a35 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-12720 recovery fails with "Generic error" for ROW_FORMAT=compressed

This bug was introduced in the fix of MDEV-12123, which invoked
page_zip_write_header() in the wrong way.

page_zip_write_header(): Assert that the length is not zero, to
be compatible with page_zip_parse_write_header().

btr_root_raise_and_insert(): Update the uncompressed page and then
invoke page_zip_write_header() with the correct length.
parent d0ce8704
#
# MDEV-12720 recovery fails with "Generic error"
# for ROW_FORMAT=compressed
#
CREATE TABLE a(i INT PRIMARY KEY AUTO_INCREMENT, s VARCHAR(255)) ENGINE=InnoDB
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1;
BEGIN;
insert into a(i) select null;
insert into a select null, uuid() from a a, a b, a c;
insert into a select null, uuid() from a a, a b, a c;
insert into a select null, uuid() from a a, a b, a c;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
COMMIT;
SELECT COUNT(*) from a;
COUNT(*)
1010
DROP TABLE a;
--source include/have_innodb.inc
--source include/have_innodb_max_16k.inc
--source include/not_embedded.inc
--echo #
--echo # MDEV-12720 recovery fails with "Generic error"
--echo # for ROW_FORMAT=compressed
--echo #
CREATE TABLE a(i INT PRIMARY KEY AUTO_INCREMENT, s VARCHAR(255)) ENGINE=InnoDB
ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1;
BEGIN;
insert into a(i) select null;
insert into a select null, uuid() from a a, a b, a c;
insert into a select null, uuid() from a a, a b, a c;
insert into a select null, uuid() from a a, a b, a c;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
COMMIT;
--let $shutdown_timeout=0
--source include/restart_mysqld.inc
SELECT COUNT(*) from a;
DROP TABLE a;
...@@ -1991,10 +1991,9 @@ btr_root_raise_and_insert( ...@@ -1991,10 +1991,9 @@ btr_root_raise_and_insert(
longer is a leaf page. (Older versions of InnoDB did longer is a leaf page. (Older versions of InnoDB did
set PAGE_MAX_TRX_ID on all secondary index pages.) */ set PAGE_MAX_TRX_ID on all secondary index pages.) */
if (root_page_zip) { if (root_page_zip) {
page_zip_write_header( byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + root;
root_page_zip, memset(p, 0, 8);
PAGE_HEADER + PAGE_MAX_TRX_ID page_zip_write_header(root_page_zip, p, 8, mtr);
+ root, 0, mtr);
} else { } else {
mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID
+ root, 0, mtr); + root, 0, mtr);
...@@ -2004,10 +2003,9 @@ btr_root_raise_and_insert( ...@@ -2004,10 +2003,9 @@ btr_root_raise_and_insert(
root page; on other clustered index pages, we want to reserve root page; on other clustered index pages, we want to reserve
the field PAGE_MAX_TRX_ID for future use. */ the field PAGE_MAX_TRX_ID for future use. */
if (new_page_zip) { if (new_page_zip) {
page_zip_write_header( byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + new_page;
new_page_zip, memset(p, 0, 8);
PAGE_HEADER + PAGE_MAX_TRX_ID page_zip_write_header(new_page_zip, p, 8, mtr);
+ new_page, 0, mtr);
} else { } else {
mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID
+ new_page, 0, mtr); + new_page, 0, mtr);
......
...@@ -4634,6 +4634,7 @@ page_zip_write_header_log( ...@@ -4634,6 +4634,7 @@ page_zip_write_header_log(
#if PAGE_DATA > 255 #if PAGE_DATA > 255
# error "PAGE_DATA > 255" # error "PAGE_DATA > 255"
#endif #endif
ut_ad(length > 0);
ut_ad(length < 256); ut_ad(length < 256);
/* If no logging is requested, we may return now */ /* If no logging is requested, we may return now */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment