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(
longer is a leaf page. (Older versions of InnoDB did
set PAGE_MAX_TRX_ID on all secondary index pages.) */
if (root_page_zip) {
page_zip_write_header(
root_page_zip,
PAGE_HEADER + PAGE_MAX_TRX_ID
+ root, 0, mtr);
byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + root;
memset(p, 0, 8);
page_zip_write_header(root_page_zip, p, 8, mtr);
} else {
mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID
+ root, 0, mtr);
......@@ -2004,10 +2003,9 @@ btr_root_raise_and_insert(
root page; on other clustered index pages, we want to reserve
the field PAGE_MAX_TRX_ID for future use. */
if (new_page_zip) {
page_zip_write_header(
new_page_zip,
PAGE_HEADER + PAGE_MAX_TRX_ID
+ new_page, 0, mtr);
byte* p = PAGE_HEADER + PAGE_MAX_TRX_ID + new_page;
memset(p, 0, 8);
page_zip_write_header(new_page_zip, p, 8, mtr);
} else {
mlog_write_ull(PAGE_HEADER + PAGE_MAX_TRX_ID
+ new_page, 0, mtr);
......
......@@ -4634,6 +4634,7 @@ page_zip_write_header_log(
#if PAGE_DATA > 255
# error "PAGE_DATA > 255"
#endif
ut_ad(length > 0);
ut_ad(length < 256);
/* 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