Skip to content

Commit 1fd7d3a

Browse files
MDEV-25581 Allow user thread to do InnoDB fts cache sync
Problem: ======== InnoDB FTS requesting the fts sync of the table once the fts cache size reaches 1/10 of innodb_ft_cache_size. But fts_sync() releases cache lock when writing the word. By doing this, InnoDB insert thread increases the innodb fts cache memory and SYNC operation will take more time to complete. Solution: ========= Remove the fts sync operation(FTS_MSG_SYNC_TABLE) from the fts optimize background thread. Instead of that, allow user thread to sync the InnoDB fts cache when the cache size exceeds 512 kb. User thread holds cache lock while doing cache syncing, it make sure that other threads doesn't add the docs into the cache. Removed FTS_MSG_SYNC_TABLE and its related function because we do remove the FTS_MSG_SYNC_TABLE message itself. Removed fts_sync_index_check() and all related function because other threads doesn't add while cache operation going on.
1 parent 51ca5d5 commit 1fd7d3a

File tree

11 files changed

+82
-395
lines changed

11 files changed

+82
-395
lines changed

mysql-test/suite/innodb_fts/r/concurrent_insert.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ INSERT INTO t2 VALUES('mariadb');
1919
connection default;
2020
SET @saved_dbug = @@GLOBAL.debug_dbug;
2121
SET GLOBAL debug_dbug ='+d,fts_instrument_sync_request,ib_optimize_wq_hang';
22-
SET DEBUG_SYNC= 'fts_instrument_sync_request
22+
SET DEBUG_SYNC= 'fts_sync_end
2323
SIGNAL drop_index_start WAIT_FOR sync_op';
2424
INSERT INTO t1 VALUES('Keyword');
2525
connect con1,localhost,root,,,;

mysql-test/suite/innodb_fts/r/sync.result

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ INSERT INTO t1(title) VALUES('database');
1111
connection con1;
1212
SET @old_dbug = @@SESSION.debug_dbug;
1313
SET debug_dbug = '+d,fts_instrument_sync_debug';
14-
SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR selected';
14+
SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR selected';
1515
INSERT INTO t1(title) VALUES('mysql database');
1616
connection default;
1717
SET DEBUG_SYNC= 'now WAIT_FOR written';
1818
SET GLOBAL innodb_ft_aux_table="test/t1";
1919
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
2020
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
21+
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
22+
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
2123
database 2 3 2 2 0
2224
database 2 3 2 3 6
2325
mysql 1 3 2 1 0
2426
mysql 1 3 2 3 0
25-
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
26-
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
2727
SET GLOBAL innodb_ft_aux_table=default;
2828
SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database');
2929
FTS_DOC_ID title
@@ -59,7 +59,7 @@ INSERT INTO t1(title) VALUES('mysql');
5959
INSERT INTO t1(title) VALUES('database');
6060
connection con1;
6161
SET debug_dbug = '+d,fts_instrument_sync_debug';
62-
SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR inserted';
62+
SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR inserted';
6363
INSERT INTO t1(title) VALUES('mysql database');
6464
connection default;
6565
SET DEBUG_SYNC= 'now WAIT_FOR written';
@@ -70,14 +70,14 @@ SET debug_dbug = @old_dbug;
7070
SET GLOBAL innodb_ft_aux_table="test/t1";
7171
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
7272
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
73+
database 4 4 1 4 6
74+
mysql 4 4 1 4 0
7375
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
7476
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
7577
database 2 3 2 2 0
7678
database 2 3 2 3 6
77-
database 4 4 1 4 6
78-
mysql 1 4 3 1 0
79-
mysql 1 4 3 3 0
80-
mysql 1 4 3 4 0
79+
mysql 1 3 2 1 0
80+
mysql 1 3 2 3 0
8181
SET GLOBAL innodb_ft_aux_table=default;
8282
SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database');
8383
FTS_DOC_ID title

mysql-test/suite/innodb_fts/r/sync_block.result

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ connection con1;
3030
connection con2;
3131
/* conneciton con2 */ SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database');
3232
FTS_DOC_ID title
33+
1 mysql database
3334
connection default;
3435
# make con1 & con2 show up in mysql.slow_log
3536
SELECT SLEEP(2);
@@ -39,41 +40,11 @@ SLEEP(2)
3940
SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02';
4041
sql_text
4142
INSERT INTO t1(title) VALUES('mysql database')
43+
SELECT * FROM t1 WHERE MATCH(title) AGAINST('mysql database')
4244
SET GLOBAL debug_dbug = @old_debug;
4345
TRUNCATE TABLE mysql.slow_log;
4446
DROP TABLE t1;
45-
# Case 2: Sync blocks DML(insert) on other tables.
46-
CREATE TABLE t1 (
47-
FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
48-
title VARCHAR(200),
49-
FULLTEXT(title)
50-
) ENGINE = InnoDB;
51-
CREATE TABLE t2(id INT);
52-
connection con1;
53-
SET GLOBAL debug_dbug='+d,fts_instrument_sync_request,fts_instrument_sync_sleep';
54-
SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL begin WAIT_FOR continue';
55-
INSERT INTO t1(title) VALUES('mysql database');
56-
connection con2;
57-
SET DEBUG_SYNC= 'now WAIT_FOR begin';
58-
INSERT INTO t2 VALUES(1);
59-
connection default;
60-
SET DEBUG_SYNC= 'now SIGNAL continue';
61-
connection con1;
62-
/* connection con1 */ INSERT INTO t1(title) VALUES('mysql database');
63-
connection con2;
64-
/* conneciton con2 */ INSERT INTO t2 VALUES(1);
65-
connection default;
66-
SET DEBUG_SYNC = 'RESET';
67-
# make con1 & con2 show up in mysql.slow_log
68-
SELECT SLEEP(2);
69-
SLEEP(2)
70-
0
71-
# slow log results should be empty here.
72-
SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02';
73-
sql_text
74-
SET GLOBAL debug_dbug = @old_debug;
75-
TRUNCATE TABLE mysql.slow_log;
76-
DROP TABLE t1,t2;
47+
SET DEBUG_SYNC=RESET;
7748
disconnect con1;
7849
disconnect con2;
7950
# Restore slow log settings.

mysql-test/suite/innodb_fts/t/concurrent_insert.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ INSERT INTO t2 VALUES('mariadb');
3131
connection default;
3232
SET @saved_dbug = @@GLOBAL.debug_dbug;
3333
SET GLOBAL debug_dbug ='+d,fts_instrument_sync_request,ib_optimize_wq_hang';
34-
SET DEBUG_SYNC= 'fts_instrument_sync_request
34+
SET DEBUG_SYNC= 'fts_sync_end
3535
SIGNAL drop_index_start WAIT_FOR sync_op';
3636
send INSERT INTO t1 VALUES('Keyword');
3737

mysql-test/suite/innodb_fts/t/sync.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ connection con1;
2626
SET @old_dbug = @@SESSION.debug_dbug;
2727
SET debug_dbug = '+d,fts_instrument_sync_debug';
2828

29-
SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR selected';
29+
SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR selected';
3030

3131
send INSERT INTO t1(title) VALUES('mysql database');
3232

@@ -73,7 +73,7 @@ connection con1;
7373

7474
SET debug_dbug = '+d,fts_instrument_sync_debug';
7575

76-
SET DEBUG_SYNC= 'fts_write_node SIGNAL written WAIT_FOR inserted';
76+
SET DEBUG_SYNC= 'fts_sync_end SIGNAL written WAIT_FOR inserted';
7777

7878
send INSERT INTO t1(title) VALUES('mysql database');
7979

mysql-test/suite/innodb_fts/t/sync_block.test

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -65,53 +65,7 @@ SET GLOBAL debug_dbug = @old_debug;
6565
TRUNCATE TABLE mysql.slow_log;
6666

6767
DROP TABLE t1;
68-
69-
--echo # Case 2: Sync blocks DML(insert) on other tables.
70-
CREATE TABLE t1 (
71-
FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
72-
title VARCHAR(200),
73-
FULLTEXT(title)
74-
) ENGINE = InnoDB;
75-
76-
CREATE TABLE t2(id INT);
77-
78-
connection con1;
79-
80-
SET GLOBAL debug_dbug='+d,fts_instrument_sync_request,fts_instrument_sync_sleep';
81-
82-
SET DEBUG_SYNC= 'fts_instrument_sync_request SIGNAL begin WAIT_FOR continue';
83-
84-
send INSERT INTO t1(title) VALUES('mysql database');
85-
86-
connection con2;
87-
88-
SET DEBUG_SYNC= 'now WAIT_FOR begin';
89-
90-
send INSERT INTO t2 VALUES(1);
91-
92-
connection default;
93-
SET DEBUG_SYNC= 'now SIGNAL continue';
94-
95-
connection con1;
96-
--echo /* connection con1 */ INSERT INTO t1(title) VALUES('mysql database');
97-
--reap
98-
99-
connection con2;
100-
--echo /* conneciton con2 */ INSERT INTO t2 VALUES(1);
101-
--reap
102-
103-
connection default;
104-
SET DEBUG_SYNC = 'RESET';
105-
-- echo # make con1 & con2 show up in mysql.slow_log
106-
SELECT SLEEP(2);
107-
-- echo # slow log results should be empty here.
108-
SELECT sql_text FROM mysql.slow_log WHERE query_time >= '00:00:02';
109-
110-
SET GLOBAL debug_dbug = @old_debug;
111-
TRUNCATE TABLE mysql.slow_log;
112-
113-
DROP TABLE t1,t2;
114-
68+
SET DEBUG_SYNC=RESET;
11569
disconnect con1;
11670
disconnect con2;
11771

0 commit comments

Comments
 (0)