Skip to content

Commit 33589b2

Browse files
author
Jan Lindström
committed
MDEV-7762 InnoDB: Failing assertion: block->page.buf_fix_count > 0 in buf0buf.ic line 730
Analysis: debug only assertion I_S function (IS is XtraDB feature) is calling buf_block_get_frame on any page it reads, which debug-asserts that the page is buffer-fixed, which is not the case in I_S query. Fixed by holding the buffer page mutex while the fields are read directly.
1 parent 13ad179 commit 33589b2

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CREATE TABLE t1 ENGINE=InnoDB AS SELECT * FROM mysql.help_topic;
2+
DROP TABLE t1;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--loose-innodb_trx
2+
--loose-innodb_locks
3+
--loose-innodb_lock_waits
4+
--loose-innodb_cmp
5+
--loose-innodb_cmp_reset
6+
--loose-innodb_cmp_per_index
7+
--loose-innodb_cmp_per_index_reset
8+
--loose-innodb_cmpmem
9+
--loose-innodb_cmpmem_reset
10+
--loose-innodb_buffer_page
11+
--loose-innodb_buffer_page_lru
12+
--loose-innodb_buffer_stats
13+
--loose-innodb_sys_tables
14+
--loose-innodb_sys_tablestats
15+
--loose-innodb_sys_indexes
16+
--loose-innodb_sys_columns
17+
--loose-innodb_sys_fields
18+
--loose-innodb_sys_foreign
19+
--loose-innodb_sys_foreign_cols
20+
--loose-innodb_changed_pages
21+
--loose-innodb_rseg
22+
--loose-innodb_undo_logs
23+
--loose-innodb_sys_stats
24+
--loose-innodb_table_stats
25+
--loose-innodb_index_stats
26+
--loose-innodb_admin_command
27+
--loose-innodb_buffer_pool_pages
28+
--loose-innodb_buffer_pool_pages_index
29+
--loose-innodb_buffer_pool_pages_blob
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
-- source include/have_innodb.inc
2+
-- source include/not_embedded.inc
3+
4+
#
5+
# MDEV-7762 InnoDB: Failing assertion: block->page.buf_fix_count > 0 in buf0buf.ic line 730
6+
#
7+
# Make sure that all supported information_schema tables are readable
8+
# (actual result sets are not important).
9+
#
10+
CREATE TABLE t1 ENGINE=InnoDB AS SELECT * FROM mysql.help_topic;
11+
12+
--disable_query_log
13+
--disable_result_log
14+
BEGIN;
15+
SELECT * FROM t1 FOR UPDATE;
16+
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
17+
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
18+
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
19+
SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP;
20+
SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP_RESET;
21+
SELECT * FROM INFORMATION_SCHEMA.INNODB_CMPMEM;
22+
SELECT * FROM INFORMATION_SCHEMA.INNODB_CMPMEM_RESET;
23+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
24+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU;
25+
--error 0,1109
26+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_STATS;
27+
--error 0,1109
28+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;
29+
--error 0,1109
30+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS;
31+
--error 0,1109
32+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES;
33+
--error 0,1109
34+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS;
35+
--error 0,1109
36+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS;
37+
--error 0,1109
38+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
39+
--error 0,1109
40+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS;
41+
--error 0,1109
42+
SELECT * FROM INFORMATION_SCHEMA.INNODB_RSEG;
43+
--error 0,1109
44+
SELECT * FROM INFORMATION_SCHEMA.INNODB_UNDO_LOGS;
45+
--error 0,1109
46+
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_STATS;
47+
--error 0,1109
48+
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS;
49+
--error 0,1109
50+
SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEX_STATS;
51+
--error 0,1109
52+
SELECT * FROM INFORMATION_SCHEMA.INNODB_ADMIN_COMMAND;
53+
--error 0,1109
54+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_PAGES;
55+
--error 0,1109
56+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_PAGES_INDEX;
57+
--error 0,1109
58+
SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_PAGES_BLOB;
59+
--error 0,1109
60+
SELECT * FROM INFORMATION_SCHEMA.INNODB_CHANGED_PAGES;
61+
COMMIT;
62+
--enable_query_log
63+
--enable_result_log
64+
DROP TABLE t1;

storage/xtradb/handler/i_s.cc

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6664,9 +6664,10 @@ i_s_innodb_buffer_pool_pages_blob_fill(
66646664
buf_pool = buf_pool_from_array(i);
66656665

66666666
buf_pool_mutex_enter(buf_pool);
6667-
6667+
66686668
for (n_block = 0; n_block < buf_pool->curr_size; n_block++) {
66696669
buf_block_t* block = buf_page_from_array(buf_pool, n_block);
6670+
mutex_t* block_mutex = buf_page_get_mutex_enter((buf_page_t*)block);
66706671
page_zip_des_t* block_page_zip = buf_block_get_page_zip(block);
66716672
const buf_frame_t* frame = block->frame;
66726673

@@ -6676,16 +6677,16 @@ i_s_innodb_buffer_pool_pages_blob_fill(
66766677
part_len = 0; /* hmm, can't figure it out */
66776678

66786679
next_page_no = mach_read_from_4(
6679-
buf_block_get_frame(block)
6680-
+ FIL_PAGE_NEXT);
6680+
frame
6681+
+ FIL_PAGE_NEXT);
66816682
} else {
66826683
part_len = mach_read_from_4(
6683-
buf_block_get_frame(block)
6684+
frame
66846685
+ FIL_PAGE_DATA
66856686
+ 0 /*BTR_BLOB_HDR_PART_LEN*/);
66866687

66876688
next_page_no = mach_read_from_4(
6688-
buf_block_get_frame(block)
6689+
frame
66896690
+ FIL_PAGE_DATA
66906691
+ 4 /*BTR_BLOB_HDR_NEXT_PAGE_NO*/);
66916692
}
@@ -6712,7 +6713,9 @@ i_s_innodb_buffer_pool_pages_blob_fill(
67126713
}
67136714

67146715
}
6715-
}
6716+
6717+
mutex_exit(block_mutex);
6718+
}
67166719

67176720
buf_pool_mutex_exit(buf_pool);
67186721
}

0 commit comments

Comments
 (0)