Skip to content

Commit 12d0a27

Browse files
author
Jakub Łopuszański
committed
Bug#28733170: PERFORMANCE_SCHEMA.DATA_LOCKS DOES NOT HANDLE JOINS CORRECTLY
The iterators in table_data_locks::m_iterator[] where not being reset during ::reset_position(), which caused them to report no more rows when reused subsequently. Same problem was in table_data_lock_waits::reset_position(). Additionally, PFS_data_lock_wait_container::clear() didn't reset m_logical_row_index. This patch introduces MTRs which expose these problems, fixes them, and also changes some of integer types to size_t, to make number of warnings smaller. Reviewed-by: Marc Alff <marc.alff@oracle.com>
1 parent faed1a0 commit 12d0a27

14 files changed

+1514
-27
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
Bug #28733170
2+
PERFORMANCE_SCHEMA.DATA_LOCKS DOES NOT HANDLE JOINS CORRECTLY
3+
CREATE TABLE t1(
4+
id INT PRIMARY KEY
5+
) Engine=InnoDB;
6+
BEGIN;
7+
INSERT INTO t1 VALUES (1),(2);
8+
SELECT * FROM t1 FOR UPDATE;
9+
id
10+
1
11+
2
12+
BEGIN;
13+
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL C1_will_wait';
14+
SELECT * FROM t1 WHERE id=1 FOR UPDATE;
15+
SET DEBUG_SYNC = 'now WAIT_FOR C1_will_wait';
16+
CREATE TABLE t2 (
17+
id INT PRIMARY KEY AUTO_INCREMENT,
18+
lock_id VARCHAR(200) NOT NULL
19+
) Engine=InnoDB;
20+
INSERT INTO t2 (lock_id)
21+
SELECT blocking_engine_lock_id
22+
FROM performance_schema.data_lock_waits;
23+
SELECT COUNT(*) FROM t2;
24+
COUNT(*)
25+
2
26+
SELECT COUNT(t2.id)
27+
FROM t2
28+
JOIN performance_schema.data_lock_waits dlw
29+
ON(dlw.blocking_engine_lock_id = t2.lock_id)
30+
ORDER BY t2.id;
31+
COUNT(t2.id)
32+
2
33+
CREATE TABLE t3 (
34+
id INT PRIMARY KEY AUTO_INCREMENT,
35+
lock_id VARCHAR(200) NOT NULL
36+
) Engine=InnoDB;
37+
INSERT INTO t3 (lock_id)
38+
SELECT requesting_engine_lock_id
39+
FROM performance_schema.data_lock_waits
40+
LIMIT 1;
41+
INSERT INTO t3 (lock_id)
42+
SELECT requesting_engine_lock_id
43+
FROM performance_schema.data_lock_waits
44+
LIMIT 1;
45+
SELECT COUNT(DISTINCT t3.id)
46+
FROM t3
47+
JOIN performance_schema.data_lock_waits dlw
48+
ON(dlw.requesting_engine_lock_id = t3.lock_id)
49+
ORDER BY t3.id;
50+
COUNT(DISTINCT t3.id)
51+
2
52+
SELECT COUNT(*) FROM performance_schema.data_lock_waits;
53+
COUNT(*)
54+
2
55+
SELECT COUNT(*)
56+
FROM performance_schema.data_lock_waits
57+
JOIN performance_schema.data_locks r
58+
ON(r.engine_lock_id = requesting_engine_lock_id)
59+
JOIN performance_schema.data_locks b
60+
ON(b.engine_lock_id = blocking_engine_lock_id);
61+
COUNT(*)
62+
2
63+
DROP TABLE t2;
64+
DROP TABLE t3;
65+
ROLLBACK;
66+
DROP TABLE t1;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
Bug #28733170
2+
PERFORMANCE_SCHEMA.DATA_LOCKS DOES NOT HANDLE JOINS CORRECTLY
3+
CREATE TABLE t1(
4+
id INT PRIMARY KEY
5+
) Engine=InnoDB;
6+
BEGIN;
7+
INSERT INTO t1 VALUES (1),(2);
8+
SELECT * FROM t1 FOR UPDATE;
9+
id
10+
1
11+
2
12+
CREATE TABLE t2 (
13+
id INT PRIMARY KEY AUTO_INCREMENT,
14+
lock_id VARCHAR(200) NOT NULL
15+
) Engine=InnoDB;
16+
INSERT INTO t2 (lock_id)
17+
SELECT engine_lock_id
18+
FROM performance_schema.data_locks
19+
WHERE object_name='t1';
20+
SELECT COUNT(*) FROM t2;
21+
COUNT(*)
22+
6
23+
SELECT COUNT(t2.id)
24+
FROM t2
25+
JOIN performance_schema.data_locks dl
26+
ON(dl.engine_lock_id = t2.lock_id)
27+
ORDER BY t2.id;
28+
COUNT(t2.id)
29+
6
30+
DROP TABLE t2;
31+
ROLLBACK;
32+
DROP TABLE t1;

0 commit comments

Comments
 (0)