summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-06-14 15:35:49 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-06-14 15:35:49 +0300
commit42d3a7b63d9313bffa91d4c6c5977fda42005d26 (patch)
tree4236724b89023d29e5e090f87de41f95218725f6
parentddf511c44dcddaa153f6b0b34040fbd0eecfd9e0 (diff)
parent6c82ab4f726b83f09646c22afddd4c102e60607b (diff)
downloadmariadb-git-42d3a7b63d9313bffa91d4c6c5977fda42005d26.tar.gz
Merge 10.6 into 10.7
-rw-r--r--mysql-test/suite/innodb_fts/r/sync_block.result54
-rw-r--r--mysql-test/suite/innodb_fts/t/sync_block.test78
-rw-r--r--storage/innobase/include/mtr0mtr.h2
-rw-r--r--storage/innobase/include/mtr0mtr.inl2
-rw-r--r--storage/innobase/trx/trx0purge.cc3
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();