MDEV-28122 Optimize table crash while applying online log
- InnoDB fails to check the overflow buffer while applying the operation to the table that was rebuilt. This is caused by commit 3cef4f8f0fc88ae5bfae4603d8d600ec84cc70a9 (MDEV-515).
This commit is contained in:
parent
cca9547892
commit
ee5cadd5c8
@ -470,6 +470,29 @@ SET DEBUG_SYNC="now SIGNAL con1_signal";
|
|||||||
connection con1;
|
connection con1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connection default;
|
connection default;
|
||||||
|
#
|
||||||
|
# MDEV-28122 Optimize table crash while applying online log
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||||
|
f3 CHAR(200), f4 CHAR(200),
|
||||||
|
f5 VARCHAR(87), PRIMARY KEY(f1))ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES(6000, 6000, "InnoDB",
|
||||||
|
"MariaDB", repeat('a', 87));
|
||||||
|
SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit";
|
||||||
|
ALTER TABLE t1 FORCE;
|
||||||
|
connection con1;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR dml_start";
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 SELECT seq, seq, "IDB", "MDB", repeat('a', 87) FROM seq_1_to_127;
|
||||||
|
INSERT INTO t1 VALUES(128, 128, "IDB", "MDB", repeat('a', 86));
|
||||||
|
INSERT INTO t1 VALUES(129, 129, "idb", "mdb", repeat('a', 2));
|
||||||
|
COMMIT;
|
||||||
|
SET DEBUG_SYNC="now SIGNAL dml_commit";
|
||||||
|
connection default;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
SET DEBUG_SYNC=RESET;
|
SET DEBUG_SYNC=RESET;
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig;
|
SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
--source include/innodb_encrypt_log.inc
|
--source include/innodb_encrypt_log.inc
|
||||||
--source include/have_debug.inc
|
--source include/have_debug.inc
|
||||||
--source include/have_debug_sync.inc
|
--source include/have_debug_sync.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
let $innodb_metrics_select=
|
let $innodb_metrics_select=
|
||||||
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
|
SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl';
|
||||||
@ -440,6 +441,32 @@ connection con1;
|
|||||||
reap;
|
reap;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28122 Optimize table crash while applying online log
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||||
|
f3 CHAR(200), f4 CHAR(200),
|
||||||
|
f5 VARCHAR(87), PRIMARY KEY(f1))ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES(6000, 6000, "InnoDB",
|
||||||
|
"MariaDB", repeat('a', 87));
|
||||||
|
|
||||||
|
SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit";
|
||||||
|
SEND ALTER TABLE t1 FORCE;
|
||||||
|
|
||||||
|
connection con1;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR dml_start";
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 SELECT seq, seq, "IDB", "MDB", repeat('a', 87) FROM seq_1_to_127;
|
||||||
|
INSERT INTO t1 VALUES(128, 128, "IDB", "MDB", repeat('a', 86));
|
||||||
|
INSERT INTO t1 VALUES(129, 129, "idb", "mdb", repeat('a', 2));
|
||||||
|
COMMIT;
|
||||||
|
SET DEBUG_SYNC="now SIGNAL dml_commit";
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
reap;
|
||||||
|
CHECK TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
SET DEBUG_SYNC=RESET;
|
SET DEBUG_SYNC=RESET;
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
|
|
||||||
|
@ -2167,6 +2167,11 @@ row_log_table_apply_op(
|
|||||||
|
|
||||||
*error = DB_SUCCESS;
|
*error = DB_SUCCESS;
|
||||||
|
|
||||||
|
/* 3 = 1 (op type) + 1 (extra_size) + at least 1 byte payload */
|
||||||
|
if (mrec + 3 >= mrec_end) {
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
const bool is_instant = log->is_instant(dup->index);
|
const bool is_instant = log->is_instant(dup->index);
|
||||||
const mrec_t* const mrec_start = mrec;
|
const mrec_t* const mrec_start = mrec;
|
||||||
|
|
||||||
@ -2214,11 +2219,6 @@ row_log_table_apply_op(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ROW_T_DELETE:
|
case ROW_T_DELETE:
|
||||||
/* 1 (extra_size) + at least 1 (payload) */
|
|
||||||
if (mrec + 2 >= mrec_end) {
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
extra_size = *mrec++;
|
extra_size = *mrec++;
|
||||||
ut_ad(mrec < mrec_end);
|
ut_ad(mrec < mrec_end);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user