Skip to content

Commit fed0d85

Browse files
committed
MDEV-29559 Recovery of INSERT_HEAP_DYNAMIC into secondary index fails
log_phys_t::apply(): When parsing an INSERT_HEAP_DYNAMIC record, allow ll==rlen to hold for the last part. A secondary index record may inherit all preceding bytes from the infimum pseudo-record. For INSERT_HEAP_REDUNDANT, some header bytes will always be present because the header will never be copied from the page infimum. We will tolerate ll==rlen also in that case to be consistent with the parsing of INSERT_HEAP_DYNAMIC.
1 parent 3c8674e commit fed0d85

File tree

3 files changed

+21
-44
lines changed

3 files changed

+21
-44
lines changed

mysql-test/suite/innodb/r/recovery_shutdown.result

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,65 @@ call mtr.add_suppression("Found 1 prepared XA transactions");
44
# MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup
55
# while rolling back recovered incomplete transactions
66
#
7-
CREATE TABLE t (a INT) ENGINE=InnoDB;
8-
BEGIN;
9-
COMMIT;
107
connect con$c,localhost,root,,;
118
CREATE TABLE t8 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
129
XA START 'x';
13-
INSERT INTO t8 (a) SELECT NULL FROM t;
10+
INSERT INTO t8 (a) SELECT NULL FROM seq_1_to_100;
1411
UPDATE t8 SET a=a+100, b=a;
1512
DELETE FROM t8;
1613
XA END 'x';
1714
XA PREPARE 'x';
1815
connect con$c,localhost,root,,;
1916
CREATE TABLE t7 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
2017
BEGIN;
21-
INSERT INTO t7 (a) SELECT NULL FROM t;
18+
INSERT INTO t7 (a) SELECT NULL FROM seq_1_to_100;
2219
UPDATE t7 SET a=a+100, b=a;
2320
DELETE FROM t7;
2421
connect con$c,localhost,root,,;
2522
CREATE TABLE t6 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
2623
BEGIN;
27-
INSERT INTO t6 (a) SELECT NULL FROM t;
24+
INSERT INTO t6 (a) SELECT NULL FROM seq_1_to_100;
2825
UPDATE t6 SET a=a+100, b=a;
2926
DELETE FROM t6;
3027
connect con$c,localhost,root,,;
3128
CREATE TABLE t5 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
3229
BEGIN;
33-
INSERT INTO t5 (a) SELECT NULL FROM t;
30+
INSERT INTO t5 (a) SELECT NULL FROM seq_1_to_100;
3431
UPDATE t5 SET a=a+100, b=a;
3532
DELETE FROM t5;
3633
connect con$c,localhost,root,,;
3734
CREATE TABLE t4 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
3835
BEGIN;
39-
INSERT INTO t4 (a) SELECT NULL FROM t;
36+
INSERT INTO t4 (a) SELECT NULL FROM seq_1_to_100;
4037
UPDATE t4 SET a=a+100, b=a;
4138
DELETE FROM t4;
4239
connect con$c,localhost,root,,;
4340
CREATE TABLE t3 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
4441
BEGIN;
45-
INSERT INTO t3 (a) SELECT NULL FROM t;
42+
INSERT INTO t3 (a) SELECT NULL FROM seq_1_to_100;
4643
UPDATE t3 SET a=a+100, b=a;
4744
DELETE FROM t3;
4845
connect con$c,localhost,root,,;
4946
CREATE TABLE t2 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
5047
BEGIN;
51-
INSERT INTO t2 (a) SELECT NULL FROM t;
48+
INSERT INTO t2 (a) SELECT NULL FROM seq_1_to_100;
5249
UPDATE t2 SET a=a+100, b=a;
5350
DELETE FROM t2;
5451
connect con$c,localhost,root,,;
5552
CREATE TABLE t1 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
5653
BEGIN;
57-
INSERT INTO t1 (a) SELECT NULL FROM t;
54+
INSERT INTO t1 (a) SELECT NULL FROM seq_1_to_100;
5855
UPDATE t1 SET a=a+100, b=a;
5956
DELETE FROM t1;
60-
INSERT INTO t1(a) SELECT NULL FROM t;
61-
INSERT INTO t1(a) SELECT NULL FROM t1;
62-
INSERT INTO t1(a) SELECT NULL FROM t1;
63-
INSERT INTO t1(a) SELECT NULL FROM t1;
64-
INSERT INTO t1(a) SELECT NULL FROM t1;
57+
INSERT INTO t1(a) SELECT NULL FROM seq_1_to_1600;
6558
connection default;
6659
SET GLOBAL innodb_flush_log_at_trx_commit=1;
67-
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
60+
CREATE TABLE MDEV_29559 (a TINYINT UNSIGNED PRIMARY KEY, KEY(a)) ENGINE=InnoDB;
61+
INSERT INTO MDEV_29559 VALUES (0x69);
6862
FLUSH TABLES;
6963
# restart
70-
# restart
7164
XA RECOVER;
7265
formatID gtrid_length bqual_length data
7366
1 1 0 x
7467
# restart
75-
DROP TABLE t,u;
68+
DROP TABLE MDEV_29559;
Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
--source include/have_innodb.inc
22
--source include/not_embedded.inc
3-
# Valgrind has to be disabled as killing the server hard gives a lot of
4-
# leak warnings
5-
--source include/not_valgrind.inc
3+
--source include/have_sequence.inc
64

75
# Flush any open myisam tables from previous tests
86
FLUSH TABLES;
@@ -13,24 +11,14 @@ call mtr.add_suppression("Found 1 prepared XA transactions");
1311
--echo # while rolling back recovered incomplete transactions
1412
--echo #
1513

16-
CREATE TABLE t (a INT) ENGINE=InnoDB;
1714
let $size = 100;
1815
let $trx = 8;
19-
let $c = $size;
20-
BEGIN;
21-
--disable_query_log
22-
while ($c) {
23-
INSERT INTO t VALUES();
24-
dec $c;
25-
}
26-
--enable_query_log
27-
COMMIT;
2816

2917
let $c = $trx;
3018
connect (con$c,localhost,root,,);
3119
eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
3220
XA START 'x';
33-
eval INSERT INTO t$c (a) SELECT NULL FROM t;
21+
eval INSERT INTO t$c (a) SELECT NULL FROM seq_1_to_$size;
3422
eval UPDATE t$c SET a=a+$size, b=a;
3523
eval DELETE FROM t$c;
3624
XA END 'x';
@@ -41,28 +29,24 @@ while ($c)
4129
connect (con$c,localhost,root,,);
4230
eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
4331
BEGIN;
44-
eval INSERT INTO t$c (a) SELECT NULL FROM t;
32+
eval INSERT INTO t$c (a) SELECT NULL FROM seq_1_to_$size;
4533
eval UPDATE t$c SET a=a+$size, b=a;
4634
eval DELETE FROM t$c;
4735
dec $c;
4836
}
4937

50-
INSERT INTO t1(a) SELECT NULL FROM t;
51-
INSERT INTO t1(a) SELECT NULL FROM t1;
52-
INSERT INTO t1(a) SELECT NULL FROM t1;
53-
INSERT INTO t1(a) SELECT NULL FROM t1;
54-
INSERT INTO t1(a) SELECT NULL FROM t1;
38+
INSERT INTO t1(a) SELECT NULL FROM seq_1_to_1600;
5539

5640
--connection default
5741
SET GLOBAL innodb_flush_log_at_trx_commit=1;
58-
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
42+
CREATE TABLE MDEV_29559 (a TINYINT UNSIGNED PRIMARY KEY, KEY(a)) ENGINE=InnoDB;
43+
INSERT INTO MDEV_29559 VALUES (0x69);
5944

6045
FLUSH TABLES;
6146

6247
--let $shutdown_timeout=0
6348
--source include/restart_mysqld.inc
6449
--let $shutdown_timeout=60
65-
--source include/restart_mysqld.inc
6650

6751
# Perform a slow shutdown in order to roll back all recovered transactions
6852
# and to avoid locking conflicts with the DROP TABLE below.
@@ -85,4 +69,4 @@ dec $c;
8569
}
8670
--enable_query_log
8771

88-
DROP TABLE t,u;
72+
DROP TABLE MDEV_29559;

storage/innobase/log/log0recv.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ struct log_phys_t : public log_rec_t
359359
rlen-= ll;
360360
l+= ll;
361361
ll= mlog_decode_varint_length(*l);
362-
if (UNIV_UNLIKELY(ll > 3 || ll >= rlen))
362+
if (UNIV_UNLIKELY(ll > 3 || ll > rlen))
363363
goto record_corrupted;
364364
size_t data_c= mlog_decode_varint(l);
365365
ut_ad(data_c != MLOG_DECODE_ERROR);
@@ -386,7 +386,7 @@ struct log_phys_t : public log_rec_t
386386
rlen-= ll;
387387
l+= ll;
388388
ll= mlog_decode_varint_length(*l);
389-
if (UNIV_UNLIKELY(ll > 2 || ll >= rlen))
389+
if (UNIV_UNLIKELY(ll > 2 || ll > rlen))
390390
goto record_corrupted;
391391
size_t data_c= mlog_decode_varint(l);
392392
rlen-= ll;

0 commit comments

Comments
 (0)