mirror of
https://github.com/MariaDB/server.git
synced 2025-07-06 11:28:13 +02:00

Problem: ======= - During inplace algorithm, concurrent DML fails to write the log operation into the temporary file. InnoDB fail to mark the error for the online log. - ddl_log_write() releases the global ddl lock prematurely before release the log memory entry Fix: === row_log_online_op(): Mark the error in online log when InnoDB ran out of temporary space fil_space_extend_must_retry(): Mark the os_has_said_disk_full as true if os_file_set_size() fails btr_cur_pessimistic_update(): Return error code when btr_cur_pessimistic_insert() fails ddl_log_write(): Release the global ddl lock after releasing the log memory entry when error was encountered btr_cur_optimistic_update(): Relax the assertion that blob pointer can be null during rollback because InnoDB can ran out of space while allocating the external page row_undo_mod_upd_exist_sec(): Remove the assertion which says that InnoDB should fail to build index entry when rollbacking an incomplete transaction after crash recovery. This scenario can happen when InnoDB ran out of space. row_upd_changes_ord_field_binary_func(): Relax the assertion to make that externally stored field can be null when InnoDB ran out of space.
30 lines
922 B
Text
30 lines
922 B
Text
--source include/have_innodb.inc
|
|
--source include/have_sequence.inc
|
|
--source include/have_debug.inc
|
|
--echo #
|
|
--echo # MDEV-36017 Alter table aborts when temporary
|
|
--echo # directory is full
|
|
--echo #
|
|
CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100),
|
|
f3 CHAR(100))ENGINE=InnoDB;
|
|
INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_4096;
|
|
SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit";
|
|
SEND ALTER TABLE t1 ADD KEY(f1), ADD INDEX(f3(10));
|
|
|
|
connect(con1,localhost,root,,,);
|
|
SET DEBUG_SYNC="now WAIT_FOR dml_start";
|
|
BEGIN;
|
|
INSERT INTO t1 SELECT * FROM t1;
|
|
SET STATEMENT DEBUG_DBUG="+d,os_file_write_fail" FOR COMMIT;
|
|
SET DEBUG_SYNC="now SIGNAL dml_commit";
|
|
|
|
connection default;
|
|
--error ER_TEMP_FILE_WRITE_FAILURE
|
|
reap;
|
|
disconnect con1;
|
|
CHECK TABLE t1;
|
|
DROP TABLE t1;
|
|
|
|
SET STATEMENT DEBUG_DBUG="+d,ddl_log_write_fail" FOR
|
|
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
|
DROP TABLE t1;
|