mirror of
https://github.com/MariaDB/server.git
synced 2025-02-21 12:53:08 +01:00

By design, InnoDB has always hung when permanently running out of buffer pool, for example when several threads are waiting to allocate a block, and all of the buffer pool is buffer-fixed by the active threads. The hang that we are fixing here occurs when the buffer pool is only temporarily running out and the situation could be rescued by writing out some dirty pages or evicting some clean pages. buf_LRU_get_free_block(): Simplify the way how we wait for the buf_flush_page_cleaner thread. This fixes occasional hangs of the test encryption.innochecksum that were introduced by commita55b951e60
(MDEV-26827). To play it safe, we use a timed wait when waiting for the buf_flush_page_cleaner() thread to perform its job. Should that thread get stuck, we will invoke buf_pool.LRU_warn() in order to display a message that pages could not be freed, and keep trying to wake up the buf_flush_page_cleaner() thread. The INFORMATION_SCHEMA.INNODB_METRICS counters buffer_LRU_single_flush_failure_count and buffer_LRU_get_free_waits will be removed. The latter is represented by buffer_pool_wait_free. Also removed will be the message "InnoDB: Difficult to find free blocks in the buffer pool" because ind34479dc66
we introduced a more precise message "InnoDB: Could not free any blocks in the buffer pool" in the buf_flush_page_cleaner thread. buf_pool_t::LRU_warn(): Issue the warning message that we could not free any blocks in the buffer pool. This may also be invoked by buf_LRU_get_free_block() if buf_flush_page_cleaner() appears to be stuck. buf_pool_t::n_flush_dec(): Remove. buf_pool_t::n_flush_dec_holding_mutex(): Rename to n_flush_dec(). buf_flush_LRU_list_batch(): Increment the eviction counter for blocks of temporary, discarded or dropped tablespaces. buf_flush_LRU(): Make static, and remove the constant parameter evict=false. The only caller will be the buf_flush_page_cleaner() thread. IORequest::is_LRU(): Remove. The only case of evicting pages on write completion will be when we are writing out pages of the temporary tablespace. Those pages are not in buf_pool.flush_list, only in buf_pool.LRU. buf_page_t::flush(): Remove the parameter evict. buf_page_t::write_complete(): Change the parameter "bool temporary" to "bool persistent" and add a parameter for an already read state(). Reviewed by: Debarun Banerjee
218 lines
5.7 KiB
Text
218 lines
5.7 KiB
Text
#
|
|
# MDEV-11415 AVOID INTERMEDIATE COMMIT WHILE DOING
|
|
# ALTER TABLE...ALGORITHM=COPY
|
|
#
|
|
CREATE TABLE t(a SERIAL, b INT, c INT, d INT) ENGINE=InnoDB;
|
|
CREATE TABLE t1(a INT, b TEXT, c TEXT,
|
|
FULLTEXT(b), FULLTEXT(c(3)), FULLTEXT(b,c)) ENGINE=InnoDB;
|
|
BEGIN;
|
|
COMMIT;
|
|
SELECT COUNT(*) FROM t;
|
|
COUNT(*)
|
|
999
|
|
UPDATE t SET b=a%7, c=a%11, d=a%13;
|
|
INSERT INTO t1 VALUES(1, 'This is a first b column', 'This is a first c column');
|
|
INSERT INTO t1 VALUES(2, 'This is a second b column', 'This is a second c column');
|
|
INSERT INTO t1(a) VALUES(3);
|
|
INSERT INTO t1 VALUES(4, 'This is a third b column', 'This is a third c column');
|
|
DELETE FROM t1 WHERE a = 2;
|
|
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
4 This is a third b column This is a third c column
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` int(11) DEFAULT NULL,
|
|
`b` text DEFAULT NULL,
|
|
`c` text DEFAULT NULL,
|
|
FULLTEXT KEY `b` (`b`),
|
|
FULLTEXT KEY `c` (`c`),
|
|
FULLTEXT KEY `b_2` (`b`,`c`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
|
|
connect hang,localhost,root;
|
|
SET DEBUG_SYNC='alter_table_copy_trans_commit SIGNAL hung WAIT_FOR ever';
|
|
# create 32 secondary indexes
|
|
ALTER TABLE t ADD INDEX(b,c,d,a),ADD INDEX(b,c,a,d),ADD INDEX(b,a,c,d),ADD INDEX(b,a,d,c),
|
|
ADD INDEX(b,d,a,c),ADD INDEX(b,d,c,a),ADD INDEX(a,b,c,d),ADD INDEX(a,b,d,c),
|
|
ADD INDEX(a,c,b,d),ADD INDEX(a,c,d,b),ADD INDEX(a,d,b,c),ADD INDEX(a,d,c,b),
|
|
ADD INDEX(c,a,b,d),ADD INDEX(c,a,d,b),ADD INDEX(c,b,a,d),ADD INDEX(c,b,d,a),
|
|
ADD INDEX(c,d,a,b),ADD INDEX(c,d,b,a),ADD INDEX(d,a,b,c),ADD INDEX(d,a,c,b),
|
|
ADD INDEX(d,b,a,c),ADD INDEX(d,b,c,a),ADD INDEX(d,c,a,b),ADD INDEX(d,c,b,a),
|
|
ADD INDEX(a,b,c), ADD INDEX(a,c,b), ADD INDEX(a,c,d), ADD INDEX(a,d,c),
|
|
ADD INDEX(a,b,d), ADD INDEX(a,d,b), ADD INDEX(b,c,d), ADD INDEX(b,d,c),
|
|
ALGORITHM=COPY;
|
|
connection default;
|
|
SET DEBUG_SYNC='now WAIT_FOR hung';
|
|
# restart: --innodb-force-recovery=3
|
|
disconnect hang;
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTSBEING_DELETED.ibd
|
|
FTSBEING_DELETED_CACHE.ibd
|
|
FTSCONFIG.ibd
|
|
FTSDELETED.ibd
|
|
FTSDELETED_CACHE.ibd
|
|
db.opt
|
|
t.frm
|
|
t.ibd
|
|
t1.frm
|
|
t1.ibd
|
|
SHOW CREATE TABLE t;
|
|
Table Create Table
|
|
t CREATE TABLE `t` (
|
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
|
`b` int(11) DEFAULT NULL,
|
|
`c` int(11) DEFAULT NULL,
|
|
`d` int(11) DEFAULT NULL,
|
|
UNIQUE KEY `a` (`a`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
SELECT COUNT(*) FROM t;
|
|
COUNT(*)
|
|
999
|
|
CHECK TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t check status OK
|
|
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
4 This is a third b column This is a third c column
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` int(11) DEFAULT NULL,
|
|
`b` text DEFAULT NULL,
|
|
`c` text DEFAULT NULL,
|
|
FULLTEXT KEY `b` (`b`),
|
|
FULLTEXT KEY `c` (`c`),
|
|
FULLTEXT KEY `b_2` (`b`,`c`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
# restart: --innodb-read-only
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTSBEING_DELETED.ibd
|
|
FTSBEING_DELETED_CACHE.ibd
|
|
FTSCONFIG.ibd
|
|
FTSDELETED.ibd
|
|
FTSDELETED_CACHE.ibd
|
|
db.opt
|
|
t.frm
|
|
t.ibd
|
|
t1.frm
|
|
t1.ibd
|
|
SHOW CREATE TABLE t;
|
|
Table Create Table
|
|
t CREATE TABLE `t` (
|
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
|
`b` int(11) DEFAULT NULL,
|
|
`c` int(11) DEFAULT NULL,
|
|
`d` int(11) DEFAULT NULL,
|
|
UNIQUE KEY `a` (`a`)
|
|
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
SELECT COUNT(*) FROM t;
|
|
COUNT(*)
|
|
999
|
|
CHECK TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t check status OK
|
|
SELECT * FROM t1 WHERE MATCH(b) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(c) AGAINST ('first');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
SELECT * FROM t1 WHERE MATCH(b,c) AGAINST ('column');
|
|
a b c
|
|
1 This is a first b column This is a first c column
|
|
4 This is a third b column This is a third c column
|
|
SHOW CREATE TABLE t1;
|
|
Table Create Table
|
|
t1 CREATE TABLE `t1` (
|
|
`a` int(11) DEFAULT NULL,
|
|
`b` text DEFAULT NULL,
|
|
`c` text DEFAULT NULL,
|
|
FULLTEXT KEY `b` (`b`),
|
|
FULLTEXT KEY `c` (`c`),
|
|
FULLTEXT KEY `b_2` (`b`,`c`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
|
CHECK TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
# restart
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTS_INDEX_1.ibd
|
|
FTS_INDEX_2.ibd
|
|
FTS_INDEX_3.ibd
|
|
FTS_INDEX_4.ibd
|
|
FTS_INDEX_5.ibd
|
|
FTS_INDEX_6.ibd
|
|
FTSBEING_DELETED.ibd
|
|
FTSBEING_DELETED_CACHE.ibd
|
|
FTSCONFIG.ibd
|
|
FTSDELETED.ibd
|
|
FTSDELETED_CACHE.ibd
|
|
db.opt
|
|
t.frm
|
|
t.ibd
|
|
t1.frm
|
|
t1.ibd
|
|
DROP TABLE t1,t;
|