diff options
| author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-12-21 14:02:46 +0530 |
|---|---|---|
| committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-12-21 14:02:46 +0530 |
| commit | 4ad11a6d7fa4a269cc8c63b8031d1ff74201ebad (patch) | |
| tree | 613d856a1e140def3a7f34146d2b62bfe4569223 /mysql-test/suite/innodb/t | |
| parent | 4e0004ea13a9cf2883afe525b947dbefb18f32f3 (diff) | |
| download | mariadb-git-10.6-MDEV-515.tar.gz | |
MDEV-515 InnoDB bulk insert10.6-MDEV-515
dict_table_t::bulk_trx_id: Stores the bulk insert
transaction id. Protected by exclusive lock of the table.
It can be used by other connection read operation to
identify whether to read the table
ins_node_t::bulk_insert: Flag to indicate the bulk
insert of the table.
trx_mod_table_time_t::bulk_insert_undo: Enable undo logging
for the consecutive insert during bulk insert operation.
Introduced new undo log record "TRX_UNDO_EMPTY".
It should be first undo log during bulk insert operation.
While rollback, if innodb encounters the undo record
then it should empty the table
dict_table_t::empty_table(): Basically it empties all the
indexes associated with table . This is undo operation
of bulk insert operation. Metadata record should be retained
during this rollback operation
dict_table_t::remove_bulk_trx(): Resets the bulk_trx_id
row_log_table_empty(): If the table is being created during
empty_table() then log the EMPTY operation in the online log
row_log_online_op(): If the secondary index is being created
during empty_table() then log ROW_OP_EMPTY operation
in online log
row_log_table_apply_empty(): Applies the ROW_T_EMPTY to the
table that was being rebuild. It does call empty_table() to
empty the table.
btr_root_page_init(): Initialize the root page of the b-tree.
It is used during dict_index_t::empty() and btr_create().
btr_cur_ins_lock_and_undo(): During first insert of bulk
insert operation, write UNDO_EMPTY undo log of it and
reset DB_TRX_ID and DB_ROLL_PTR.
trx_mark_sql_stat_end(): Set the bulk_insert_undo for
bulk operation of the table. So that consecutive insert
does allow undo operation.
row_search_mvcc(): check whether the current transaction
can view the table records based on bulk_trx_id.
row_merge_read_clustered_index(): Avoid the table read if the
bulk transaction id of the table is not visible within
current transaction read view.
- HA_EXTRA_IGNORE_INSERT flag in ha_innobase::extra() is to
indicate ignore statement. Sets the bulk insert undo
for the transaction.
- Add new insert in many test case to avoid the hang. Because MDEV-515
takes X-lock of the table for first insert. So concurrent insert
will wait for X-lock to be released.
Diffstat (limited to 'mysql-test/suite/innodb/t')
| -rw-r--r-- | mysql-test/suite/innodb/t/alter_candidate_key.test | 3 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/autoinc_persist.test | 11 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/binlog_consistent.test | 11 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/ddl_purge.test | 4 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/group_commit.test | 3 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/group_commit_no_optimize_thread.test | 3 | ||||
| -rw-r--r-- | mysql-test/suite/innodb/t/innodb-lock.test | 4 |
7 files changed, 34 insertions, 5 deletions
diff --git a/mysql-test/suite/innodb/t/alter_candidate_key.test b/mysql-test/suite/innodb/t/alter_candidate_key.test index 7429cd89a1a..979d8fa4fee 100644 --- a/mysql-test/suite/innodb/t/alter_candidate_key.test +++ b/mysql-test/suite/innodb/t/alter_candidate_key.test @@ -42,6 +42,9 @@ DROP TABLE t1; SET SQL_MODE= strict_trans_tables; CREATE TABLE t1(a INT UNIQUE) ENGINE=InnoDB; +# MDEV-515 takes X-lock on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t1 VALUES(3); SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL dml WAIT_FOR dml_done'; --send ALTER TABLE t1 MODIFY COLUMN a INT NOT NULL connection con1; diff --git a/mysql-test/suite/innodb/t/autoinc_persist.test b/mysql-test/suite/innodb/t/autoinc_persist.test index fd85b45fbfa..6e094b40e02 100644 --- a/mysql-test/suite/innodb/t/autoinc_persist.test +++ b/mysql-test/suite/innodb/t/autoinc_persist.test @@ -410,6 +410,17 @@ INSERT INTO mdev6076a SET b=NULL; SELECT * FROM mdev6076a; INSERT INTO mdev6076b SET b=NULL; SELECT * FROM mdev6076b; +# MDEV-515 resets the PAGE_ROOT_AUTOINC field in +# root page during rollback. +--disable_query_log +BEGIN; +let $i = 55; +WHILE ($i) { + eval INSERT INTO mdev6076empty SET b=$i; + dec $i; +} +ROLLBACK; +--enable_query_log INSERT INTO mdev6076empty SET b=NULL; SELECT * FROM mdev6076empty; DROP TABLE mdev6076a, mdev6076b, mdev6076empty; diff --git a/mysql-test/suite/innodb/t/binlog_consistent.test b/mysql-test/suite/innodb/t/binlog_consistent.test index 2a735a30a0e..6a1935f80c4 100644 --- a/mysql-test/suite/innodb/t/binlog_consistent.test +++ b/mysql-test/suite/innodb/t/binlog_consistent.test @@ -16,7 +16,10 @@ connect(con4,localhost,root,,); connection default; CREATE TABLE t1 (a INT, b VARCHAR(100), PRIMARY KEY (a,b)) ENGINE=innodb; -let pos=`select $binlog_start_pos + 254`; +# MDEV-515 takes X-lock on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t1 VALUES(9, ""); +let pos=`select $binlog_start_pos + 422`; --replace_result $pos <pos> SHOW MASTER STATUS; --replace_result $pos <pos> @@ -53,10 +56,10 @@ COMMIT; connection default; SELECT * FROM t1 ORDER BY a,b; -let pos=`select $binlog_start_pos + 788`; +let pos=`select $binlog_start_pos + 956`; --replace_result $pos <pos> SHOW STATUS LIKE 'binlog_snapshot_%'; -let pos=`select $binlog_start_pos + 1164`; +let pos=`select $binlog_start_pos + 1332`; --replace_result $pos <pos> SHOW MASTER STATUS; SELECT * FROM t2 ORDER BY a; @@ -74,7 +77,7 @@ FLUSH LOGS; connection default; SELECT * FROM t1 ORDER BY a,b; -let pos=`select $binlog_start_pos + 788`; +let pos=`select $binlog_start_pos + 956`; --replace_result $pos <pos> SHOW STATUS LIKE 'binlog_snapshot_%'; let pos=`select $binlog_start_pos + 131`; diff --git a/mysql-test/suite/innodb/t/ddl_purge.test b/mysql-test/suite/innodb/t/ddl_purge.test index 60d17acead8..678cb597c03 100644 --- a/mysql-test/suite/innodb/t/ddl_purge.test +++ b/mysql-test/suite/innodb/t/ddl_purge.test @@ -4,7 +4,9 @@ CREATE TABLE t0 (pk INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=InnoDB; - +# MDEV-515 takes X-lock on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t0 VALUES(100); --connect (con1,localhost,root,,test) BEGIN; INSERT INTO t0 SET pk=1; diff --git a/mysql-test/suite/innodb/t/group_commit.test b/mysql-test/suite/innodb/t/group_commit.test index 692e06f38b8..3a2018bec5d 100644 --- a/mysql-test/suite/innodb/t/group_commit.test +++ b/mysql-test/suite/innodb/t/group_commit.test @@ -10,6 +10,9 @@ # to check some edge case for concurrency control. CREATE TABLE t1 (a VARCHAR(10) PRIMARY KEY) ENGINE=innodb; +# MDEV-515 takes X-lock on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t1 VALUES(100); SELECT variable_value INTO @commits FROM information_schema.global_status WHERE variable_name = 'binlog_commits'; diff --git a/mysql-test/suite/innodb/t/group_commit_no_optimize_thread.test b/mysql-test/suite/innodb/t/group_commit_no_optimize_thread.test index 85c0e295424..107fc6f4056 100644 --- a/mysql-test/suite/innodb/t/group_commit_no_optimize_thread.test +++ b/mysql-test/suite/innodb/t/group_commit_no_optimize_thread.test @@ -10,6 +10,9 @@ # to check some edge case for concurrency control. CREATE TABLE t1 (a VARCHAR(10) PRIMARY KEY) ENGINE=innodb; +# MDEV-515 takes X-LOCK on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t1 VALUES("default"); SELECT variable_value INTO @commits FROM information_schema.global_status WHERE variable_name = 'binlog_commits'; diff --git a/mysql-test/suite/innodb/t/innodb-lock.test b/mysql-test/suite/innodb/t/innodb-lock.test index 9e5505270be..84219db111e 100644 --- a/mysql-test/suite/innodb/t/innodb-lock.test +++ b/mysql-test/suite/innodb/t/innodb-lock.test @@ -199,6 +199,10 @@ DROP TABLE t1, t2; CREATE TABLE t1 (pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB PARTITION BY key (pk) PARTITIONS 2; +# MDEV-515 takes X-lock on the table for the first insert. +# So concurrent insert won't happen on the table +INSERT INTO t1 VALUES(100); +INSERT INTO t1 VALUES(101); CREATE TABLE t2 (a INT) ENGINE=InnoDB; INSERT INTO t2 VALUES (1),(2),(3),(4),(5),(6); |
