diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-14 15:35:49 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-06-14 15:35:49 +0300 |
commit | 42d3a7b63d9313bffa91d4c6c5977fda42005d26 (patch) | |
tree | 4236724b89023d29e5e090f87de41f95218725f6 | |
parent | ddf511c44dcddaa153f6b0b34040fbd0eecfd9e0 (diff) | |
parent | 6c82ab4f726b83f09646c22afddd4c102e60607b (diff) | |
download | mariadb-git-42d3a7b63d9313bffa91d4c6c5977fda42005d26.tar.gz |
Merge 10.6 into 10.7
-rw-r--r-- | mysql-test/suite/innodb_fts/r/sync_block.result | 54 | ||||
-rw-r--r-- | mysql-test/suite/innodb_fts/t/sync_block.test | 78 | ||||
-rw-r--r-- | storage/innobase/include/mtr0mtr.h | 2 | ||||
-rw-r--r-- | storage/innobase/include/mtr0mtr.inl | 2 | ||||
-rw-r--r-- | storage/innobase/trx/trx0purge.cc | 3 |
5 files changed, 4 insertions, 135 deletions
diff --git a/mysql-test/suite/innodb_fts/r/sync_block.result b/mysql-test/suite/innodb_fts/r/sync_block.result deleted file mode 100644 index c105a3d3b12..00000000000 --- a/mysql-test/suite/innodb_fts/r/sync_block.result +++ /dev/null @@ -1,54 +0,0 @@ -SET @old_log_output = @@global.log_output; -SET @old_slow_query_log = @@global.slow_query_log; -SET @old_general_log = @@global.general_log; -SET @old_long_query_time = @@global.long_query_time; -SET @old_debug = @@global.debug_dbug; -SET GLOBAL log_output = 'TABLE'; -SET GLOBAL general_log = 1; -SET GLOBAL slow_query_log = 1; -SET GLOBAL long_query_time = 1; -connect con1,localhost,root,,; -connect con2,localhost,root,,; -connection default; -# Case 1: Sync blocks DML(insert) on the same table. -CREATE TABLE t1 ( -FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -title VARCHAR(200), -FULLTEXT(title) -) ENGINE = InnoDB; -connection con1; -SET GLOBAL debug_dbug='+d,fts_instrument_sync_debug,fts_instrument_sync_sleep'; -SET DEBUG_SYNC= 'fts_sync_begin SIGNAL begin WAIT_FOR continue'; -INSERT INTO t1(title) VALUES('mysql database'); -connection con2; -SET DEBUG_SYNC= 'now WAIT_FOR begin'; -SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); -connection default; -SET DEBUG_SYNC= 'now SIGNAL continue'; -connection con1; -/* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); -connection con2; -/* conneciton con2 */ SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); -FTS_DOC_ID title -1 mysql database -connection default; -# make con1 & con2 show up in mysql.slow_log -SELECT SLEEP(2); -SLEEP(2) -0 -# slow log results should only contain INSERT INTO t1. -SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; -sql_text -INSERT INTO t1(title) VALUES('mysql database') -SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database') -SET GLOBAL debug_dbug = @old_debug; -TRUNCATE TABLE mysql.slow_log; -DROP TABLE t1; -SET DEBUG_SYNC=RESET; -disconnect con1; -disconnect con2; -# Restore slow log settings. -SET GLOBAL log_output = @old_log_output; -SET GLOBAL general_log = @old_general_log; -SET GLOBAL slow_query_log = @old_slow_query_log; -SET GLOBAL long_query_time = @old_long_query_time; diff --git a/mysql-test/suite/innodb_fts/t/sync_block.test b/mysql-test/suite/innodb_fts/t/sync_block.test deleted file mode 100644 index 705567296f7..00000000000 --- a/mysql-test/suite/innodb_fts/t/sync_block.test +++ /dev/null @@ -1,78 +0,0 @@ -# -# BUG#22516559 MYSQL INSTANCE STALLS WHEN SYNCING FTS INDEX -# - ---source include/have_innodb.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc ---source include/have_log_bin.inc ---source include/count_sessions.inc - -SET @old_log_output = @@global.log_output; -SET @old_slow_query_log = @@global.slow_query_log; -SET @old_general_log = @@global.general_log; -SET @old_long_query_time = @@global.long_query_time; -SET @old_debug = @@global.debug_dbug; - -SET GLOBAL log_output = 'TABLE'; -SET GLOBAL general_log = 1; -SET GLOBAL slow_query_log = 1; -SET GLOBAL long_query_time = 1; - -connect (con1,localhost,root,,); -connect (con2,localhost,root,,); -connection default; - ---echo # Case 1: Sync blocks DML(insert) on the same table. -CREATE TABLE t1 ( - FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, - title VARCHAR(200), - FULLTEXT(title) -) ENGINE = InnoDB; - -connection con1; - -SET GLOBAL debug_dbug='+d,fts_instrument_sync_debug,fts_instrument_sync_sleep'; - -SET DEBUG_SYNC= 'fts_sync_begin SIGNAL begin WAIT_FOR continue'; - -send INSERT INTO t1(title) VALUES('mysql database'); - -connection con2; - -SET DEBUG_SYNC= 'now WAIT_FOR begin'; - -send SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); - -connection default; -SET DEBUG_SYNC= 'now SIGNAL continue'; - -connection con1; ---echo /* connection con1 */ INSERT INTO t1(title) VALUES('mysql database'); ---reap - -connection con2; ---echo /* conneciton con2 */ SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database'); ---reap - -connection default; --- echo # make con1 & con2 show up in mysql.slow_log -SELECT SLEEP(2); --- echo # slow log results should only contain INSERT INTO t1. -SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02'; - -SET GLOBAL debug_dbug = @old_debug; -TRUNCATE TABLE mysql.slow_log; - -DROP TABLE t1; -SET DEBUG_SYNC=RESET; -disconnect con1; -disconnect con2; - ---source include/wait_until_count_sessions.inc - --- echo # Restore slow log settings. -SET GLOBAL log_output = @old_log_output; -SET GLOBAL general_log = @old_general_log; -SET GLOBAL slow_query_log = @old_slow_query_log; -SET GLOBAL long_query_time = @old_long_query_time; diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index ad525b41d89..84f62334c5c 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -290,9 +290,9 @@ struct mtr_t { @param[in] type object type: MTR_MEMO_PAGE_X_FIX, ... */ void release_page(const void *ptr, mtr_memo_type_t type); -private: /** Note that the mini-transaction will modify data. */ void flag_modified() { m_modifications = true; } +private: /** Mark the given latched page as modified. @param block page that will be modified */ void modify(const buf_block_t& block); diff --git a/storage/innobase/include/mtr0mtr.inl b/storage/innobase/include/mtr0mtr.inl index 21ff912e9c7..71b476a2f5d 100644 --- a/storage/innobase/include/mtr0mtr.inl +++ b/storage/innobase/include/mtr0mtr.inl @@ -46,7 +46,7 @@ mtr_t::memo_push(void* object, mtr_memo_type_t type) ut_ad(object != NULL); ut_ad(type >= MTR_MEMO_PAGE_S_FIX); ut_ad(type <= MTR_MEMO_SPACE_S_LOCK); - ut_ad(ut_is_2pow(type)); + ut_ad(type == MTR_MEMO_PAGE_X_MODIFY || ut_is_2pow(type)); /* If this mtr has x-fixed a clean page then we set the made_dirty flag. This tells us if we need to diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 27555a0360f..b61187d7392 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -402,8 +402,9 @@ static dberr_t trx_purge_free_segment(trx_rseg_t *rseg, fil_addr_t hdr_addr) block->fix(); mtr.commit(); mtr.start(); + mtr.flag_modified(); mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX); - mtr.memo_push(block, MTR_MEMO_PAGE_X_FIX); + mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); rseg->latch.wr_lock(SRW_LOCK_CALL); rseg_hdr->page.lock.x_lock(); block->page.lock.x_lock(); |