~ubuntu-branches/ubuntu/maverick/mysql-5.1/maverick-proposed

« back to all changes in this revision

Viewing changes to mysql-test/suite/innodb/t/innodb_replace.test

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2012-02-22 14:16:05 UTC
  • mto: This revision was merged to the branch mainline in revision 20.
  • Revision ID: package-import@ubuntu.com-20120222141605-nxlu9yzc6attylc2
Tags: upstream-5.1.61
ImportĀ upstreamĀ versionĀ 5.1.61

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
--source include/have_innodb.inc
 
2
--source include/have_debug_sync.inc
 
3
 
 
4
--echo #
 
5
--echo #Bug#11759688 52020: InnoDB can still deadlock
 
6
--echo #on just INSERT...ON DUPLICATE KEY
 
7
--echo #a.k.a. Bug#7975 deadlock without any locking, simple select and update
 
8
--echo #
 
9
 
 
10
CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL) ENGINE=InnoDB;
 
11
 
 
12
INSERT INTO t1 VALUES(3,1);
 
13
 
 
14
connect (con1,localhost,root,,);
 
15
connect (con2,localhost,root,,);
 
16
connection con1;
 
17
 
 
18
BEGIN;
 
19
# normal INSERT of a duplicate should only S-lock the existing record (3,1)
 
20
SET DEBUG_SYNC='write_row_noreplace SIGNAL insert1 WAIT_FOR select1';
 
21
--send
 
22
INSERT INTO t1 VALUES(3,2);
 
23
 
 
24
connection default;
 
25
SET DEBUG_SYNC='now WAIT_FOR insert1';
 
26
# this should S-lock (3,1); no conflict
 
27
SELECT * FROM t1 LOCK IN SHARE MODE;
 
28
# this should X-lock (3,1), conflicting with con1
 
29
--send
 
30
SELECT * FROM t1 FOR UPDATE;
 
31
 
 
32
connection con2;
 
33
# Check that the above SELECT is blocked
 
34
let $wait_condition=
 
35
  select count(*) = 1 from information_schema.processlist
 
36
  where state = 'Sending data' and
 
37
        info = 'SELECT * FROM t1 FOR UPDATE';
 
38
--source include/wait_condition.inc
 
39
SET DEBUG_SYNC='now SIGNAL select1';
 
40
 
 
41
connection con1;
 
42
--error ER_DUP_ENTRY
 
43
reap;
 
44
# We are still holding an S-lock on (3,1) after the failed INSERT.
 
45
# The following will upgrade it to an X-lock, causing a deadlock.
 
46
# InnoDB should resolve the deadlock by aborting the blocked SELECT.
 
47
INSERT INTO t1 VALUES(3,3) ON DUPLICATE KEY UPDATE b=b+10;
 
48
 
 
49
connection default;
 
50
--error ER_LOCK_DEADLOCK
 
51
reap;
 
52
connection con1;
 
53
COMMIT;
 
54
 
 
55
SET DEBUG_SYNC='write_row_replace SIGNAL insert2 WAIT_FOR select2';
 
56
--send
 
57
REPLACE INTO t1 VALUES(3,4);
 
58
 
 
59
connection default;
 
60
SET DEBUG_SYNC='now WAIT_FOR insert2';
 
61
SELECT * FROM t1;
 
62
--send
 
63
SELECT * FROM t1 LOCK IN SHARE MODE;
 
64
 
 
65
connection con2;
 
66
# Check that the above SELECT is blocked because of X lock.
 
67
let $wait_condition=
 
68
  select count(*) = 1 from information_schema.processlist
 
69
  where state = 'Sending data' and
 
70
        info = 'SELECT * FROM t1 LOCK IN SHARE MODE';
 
71
--source include/wait_condition.inc
 
72
SET DEBUG_SYNC='now SIGNAL select2';
 
73
 
 
74
connection con1;
 
75
reap;
 
76
 
 
77
SET DEBUG_SYNC='write_row_replace SIGNAL insert3 WAIT_FOR select3';
 
78
--send
 
79
INSERT INTO t1 VALUES(3,5) ON DUPLICATE KEY UPDATE b=b+20;
 
80
 
 
81
connection default;
 
82
reap;
 
83
SET DEBUG_SYNC='now WAIT_FOR insert3';
 
84
--send
 
85
SELECT b FROM t1 LOCK IN SHARE MODE;
 
86
 
 
87
connection con2;
 
88
# Check that the above SELECT is blocked because of X lock.
 
89
let $wait_condition=
 
90
  select count(*) = 1 from information_schema.processlist
 
91
  where state = 'Sending data' and
 
92
        info = 'SELECT b FROM t1 LOCK IN SHARE MODE';
 
93
--source include/wait_condition.inc
 
94
SET DEBUG_SYNC='now SIGNAL select3';
 
95
 
 
96
connection default;
 
97
reap;
 
98
 
 
99
connection con1;
 
100
reap;
 
101
SET DEBUG_SYNC='write_row_noreplace SIGNAL insert4 WAIT_FOR select4';
 
102
--send
 
103
LOAD DATA INFILE '../../std_data/loaddata5.dat' INTO TABLE t1 FIELDS TERMINATED BY '' ENCLOSED BY '' (a, b);
 
104
 
 
105
connection default;
 
106
SET DEBUG_SYNC='now WAIT_FOR insert4';
 
107
# this should S-lock (3,1); no conflict
 
108
SELECT b FROM t1 WHERE a=3 LOCK IN SHARE MODE;
 
109
# this should X-lock (3,1), conflicting with con1
 
110
--send
 
111
SELECT b FROM t1 WHERE a=3 FOR UPDATE;
 
112
 
 
113
connection con2;
 
114
# Check that the above SELECT is blocked
 
115
let $wait_condition=
 
116
  select count(*) = 1 from information_schema.processlist
 
117
  where state = 'statistics' and
 
118
        info = 'SELECT b FROM t1 WHERE a=3 FOR UPDATE';
 
119
--source include/wait_condition.inc
 
120
SET DEBUG_SYNC='now SIGNAL select4';
 
121
 
 
122
connection default;
 
123
reap;
 
124
 
 
125
connection con1;
 
126
--error ER_DUP_ENTRY
 
127
reap;
 
128
SET DEBUG_SYNC='write_row_noreplace SIGNAL insert5 WAIT_FOR select5';
 
129
--send
 
130
LOAD DATA INFILE '../../std_data/loaddata5.dat' IGNORE INTO TABLE t1 FIELDS TERMINATED BY '' ENCLOSED BY '' (a, b);
 
131
 
 
132
connection default;
 
133
SET DEBUG_SYNC='now WAIT_FOR insert5';
 
134
SELECT * FROM t1;
 
135
# this should S-lock; no conflict
 
136
SELECT * FROM t1 WHERE a=3 LOCK IN SHARE MODE;
 
137
# this should X-lock, conflicting with the S-lock of the IGNORE in con1
 
138
--send
 
139
SELECT * FROM t1 WHERE a=3 FOR UPDATE;
 
140
 
 
141
connection con2;
 
142
# Check that the above SELECT is blocked
 
143
let $wait_condition=
 
144
  select count(*) = 1 from information_schema.processlist
 
145
  where state = 'statistics' and
 
146
        info = 'SELECT * FROM t1 WHERE a=3 FOR UPDATE';
 
147
--source include/wait_condition.inc
 
148
SET DEBUG_SYNC='now SIGNAL select5';
 
149
 
 
150
connection con1;
 
151
reap;
 
152
connection default;
 
153
reap;
 
154
 
 
155
connection con1;
 
156
SET DEBUG_SYNC='write_row_replace SIGNAL insert6 WAIT_FOR select6';
 
157
--send
 
158
LOAD DATA INFILE '../../std_data/loaddata5.dat' REPLACE INTO TABLE t1 FIELDS TERMINATED BY '' ENCLOSED BY '' (a, b);
 
159
 
 
160
connection default;
 
161
SET DEBUG_SYNC='now WAIT_FOR insert6';
 
162
SELECT * FROM t1;
 
163
# this should conflict with the X-lock acquired by the REPLACE
 
164
--send
 
165
SELECT a,b FROM t1 LOCK IN SHARE MODE;
 
166
 
 
167
connection con2;
 
168
# Check that the above SELECT is blocked
 
169
let $wait_condition=
 
170
  select count(*) = 1 from information_schema.processlist
 
171
  where state = 'Sending data' and
 
172
        info = 'SELECT a,b FROM t1 LOCK IN SHARE MODE';
 
173
--source include/wait_condition.inc
 
174
SET DEBUG_SYNC='now SIGNAL select6';
 
175
 
 
176
connection con1;
 
177
reap;
 
178
connection default;
 
179
reap;
 
180
 
 
181
disconnect con1;
 
182
disconnect con2;
 
183
 
 
184
connection default;
 
185
SET DEBUG_SYNC='RESET';
 
186
DROP TABLE t1;