Merge lp:~laurynas-biveinis/percona-server/26611-bug1059738-5.5 into lp:percona-server/5.5

Proposed by Laurynas Biveinis
Status: Merged
Approved by: Alexey Kopytov
Approved revision: no longer in the source branch.
Merged at revision: 352
Proposed branch: lp:~laurynas-biveinis/percona-server/26611-bug1059738-5.5
Merge into: lp:percona-server/5.5
Prerequisite: lp:~laurynas-biveinis/percona-server/26611-bug1064333-5.5
Diff against target: 369 lines (+122/-149)
6 files modified
Percona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result (+83/-0)
Percona-Server/mysql-test/t/percona_innodb_fake_changes.test (+0/-139)
Percona-Server/storage/innobase/btr/btr0cur.c (+28/-6)
Percona-Server/storage/innobase/include/btr0btr.h (+4/-1)
Percona-Server/storage/innobase/row/row0ins.c (+5/-2)
Percona-Server/storage/innobase/row/row0upd.c (+2/-1)
To merge this branch: bzr merge lp:~laurynas-biveinis/percona-server/26611-bug1059738-5.5
Reviewer Review Type Date Requested Status
Alexey Kopytov (community) Approve
Review via email: mp+131832@code.launchpad.net

This proposal supersedes a proposal from 2012-10-18.

Description of the change

- No new Jenkins, as the only code changes are formatting and comments.

Merge bug 1059738 fix from 5.1. Not an automerge, but close.

26611

http://jenkins.percona.com/job/percona-server-5.5-param/556/

To post a comment you must log in.
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote : Posted in a previous version of this proposal

Will self-approve myself after 5.1 is approved.

Revision history for this message
Alexey Kopytov (akopytov) wrote : Posted in a previous version of this proposal

Same comments as in 5.1 + what are the test case changes for?

review: Needs Fixing
Revision history for this message
Laurynas Biveinis (laurynas-biveinis) wrote : Posted in a previous version of this proposal

> what are the test case changes for?

These are not the part of the commit being MP'ed. They look like prerequisite branch changes shown for some reason.

Revision history for this message
Alexey Kopytov (akopytov) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'Percona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result'
2--- Percona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result 1970-01-01 00:00:00 +0000
3+++ Percona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result 2012-10-29 08:57:32 +0000
4@@ -0,0 +1,83 @@
5+DROP TABLE IF EXISTS t1, t2;
6+CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
7+INSERT INTO t1 VALUES (1);
8+CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB;
9+INSERT INTO t2 VALUES (1, 1);
10+# Verifying that X_LOCK not acquired
11+SET autocommit=0;
12+SET innodb_fake_changes=1;
13+BEGIN;
14+SELECT * FROM t1 FOR UPDATE;
15+a
16+1
17+SET innodb_lock_wait_timeout=3;
18+UPDATE t1 SET a=2;
19+ERROR HY000: Lock wait timeout exceeded; try restarting transaction
20+SELECT * FROM t1 LOCK IN SHARE MODE;
21+a
22+1
23+ROLLBACK;
24+# Confirm no lock wait timeouts when innodb_locking_fake_changes=0
25+SET GLOBAL innodb_locking_fake_changes=0;
26+BEGIN;
27+SELECT * FROM t1 FOR UPDATE;
28+a
29+1
30+BEGIN;
31+UPDATE t1 SET a=3 WHERE a=1;
32+SELECT * FROM t1 LOCK IN SHARE MODE;
33+a
34+3
35+ROLLBACK;
36+ROLLBACK;
37+# Confirm that fake UPDATE does not hold a lock
38+BEGIN;
39+SELECT * FROM t1 FOR UPDATE;
40+a
41+1
42+BEGIN;
43+UPDATE t1 SET a=3 WHERE a=1;
44+ROLLBACK;
45+ROLLBACK;
46+BEGIN;
47+UPDATE t1 SET a=3 WHERE a=1;
48+BEGIN;
49+UPDATE t1 SET a=3 WHERE a=1;
50+ROLLBACK;
51+ROLLBACK;
52+# Confirm that fake INSERT does not hold a lock
53+BEGIN;
54+INSERT INTO t1 VALUES(4);
55+BEGIN;
56+INSERT INTO t1 VALUES(4);
57+ROLLBACK;
58+ROLLBACK;
59+# Confirm that fake DELETE does not hold a lock
60+BEGIN;
61+DELETE FROM t1 WHERE a=1;
62+BEGIN;
63+DELETE FROM t1 WHERE a=1;
64+ROLLBACK;
65+ROLLBACK;
66+# Confirm that fake REPLACE does not hold a lock
67+BEGIN;
68+REPLACE INTO t2 VALUES(1, 2);
69+BEGIN;
70+REPLACE INTO t2 VALUES(1, 2);
71+ROLLBACK;
72+ROLLBACK;
73+SET innodb_fake_changes=default;
74+SET GLOBAL innodb_locking_fake_changes=default;
75+# Verify that the fake changes to t1 did not leak through
76+CHECK TABLE t1;
77+Table Op Msg_type Msg_text
78+test.t1 check status OK
79+should_be_1
80+1
81+# Verify that the fake changes to t2 did not leak through
82+CHECK TABLE t2;
83+Table Op Msg_type Msg_text
84+test.t2 check status OK
85+should_be_1
86+1
87+DROP TABLE t1, t2;
88
89=== removed file 'Percona-Server/mysql-test/t/percona_innodb_fake_changes.test'
90--- Percona-Server/mysql-test/t/percona_innodb_fake_changes.test 2012-10-29 08:57:31 +0000
91+++ Percona-Server/mysql-test/t/percona_innodb_fake_changes.test 1970-01-01 00:00:00 +0000
92@@ -1,139 +0,0 @@
93---source include/have_innodb.inc
94-
95---disable_warnings
96-DROP TABLE IF EXISTS t1, t2, t3;
97---enable_warnings
98-
99-
100---echo # Checking variables
101-SHOW VARIABLES LIKE 'innodb_fake_changes';
102-SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='innodb_fake_changes';
103-SET innodb_fake_changes=1;
104-SHOW VARIABLES LIKE 'innodb_fake_changes';
105-SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='innodb_fake_changes';
106-SET innodb_fake_changes=default;
107-SHOW VARIABLES LIKE 'innodb_fake_changes';
108-SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='innodb_fake_changes';
109-
110---echo # Explicit COMMIT should fail when innodb_fake_changes is enabled
111---echo # DML should be fine
112-SET @@GLOBAL.userstat= TRUE;
113-CREATE TABLE t1 (a INT) ENGINE=InnoDB;
114-INSERT INTO t1 VALUES (1);
115-
116-let $t1_checksum_1= `CHECKSUM TABLE t1 EXTENDED`;
117-let $innodb_rows_inserted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_inserted'`;
118-let $innodb_rows_deleted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
119-let $innodb_rows_updated_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
120-let $table_rows_estimate_1= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
121-let $table_rows_changed_1= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
122-let $table_rows_changed_x_indexes_1= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
123-
124-SET autocommit=0;
125-SET innodb_fake_changes=1;
126-BEGIN;
127-INSERT INTO t1 VALUES (2);
128-UPDATE t1 SET a=0;
129-DELETE FROM t1 LIMIT 1;
130-SELECT * FROM t1;
131---error 1180
132-COMMIT;
133-SET innodb_fake_changes=default;
134---echo # Verify that the fake changes to t1 did not leak through
135-CHECK TABLE t1;
136-let $t1_checksum_2= `CHECKSUM TABLE t1 EXTENDED`;
137-let $innodb_rows_inserted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_inserted'`;
138-let $innodb_rows_deleted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
139-let $innodb_rows_updated_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
140-let $table_rows_estimate_2= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
141-let $table_rows_changed_2= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
142-let $table_rows_changed_x_indexes_2= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't1'`;
143---disable_query_log
144-eval SELECT "$t1_checksum_1" LIKE "$t1_checksum_2" AS should_be_1;
145-eval SELECT "$innodb_rows_inserted_2" - "$innodb_rows_inserted_1" AS should_be_0;
146-eval SELECT "$innodb_rows_deleted_2" - "$innodb_rows_deleted_1" AS should_be_0;
147-eval SELECT "$innodb_rows_updated_2" - "$innodb_rows_updated_1" AS should_be_0;
148-eval SELECT "$table_rows_estimate_2" - "$table_rows_estimate_1" AS should_be_0;
149-eval SELECT "$table_rows_changed_2" - "$table_rows_changed_1" AS should_be_0;
150-eval SELECT "$table_rows_changed_x_indexes_2" - "$table_rows_changed_x_indexes_1" AS should_be_0;
151---enable_query_log
152-DROP TABLE t1;
153-
154---echo # DDL must result in error
155-CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
156-SET autocommit=0;
157-SET innodb_fake_changes=1;
158-BEGIN;
159---error 1005
160-CREATE TABLE t2 (a INT) ENGINE=InnoDB;
161---error 1051
162-DROP TABLE t1;
163---error 1180
164-TRUNCATE TABLE t1;
165---error 1180
166-ALTER TABLE t1 ENGINE=MyISAM;
167-ROLLBACK;
168-
169-# Test stat counters foreign key constraints
170-SET innodb_fake_changes=0;
171-INSERT INTO t1 VALUES (1), (2);
172-COMMIT;
173-CREATE TABLE t2 (a INT PRIMARY KEY, b INT, INDEX b_ind (b),
174- FOREIGN KEY (b) REFERENCES t1(a) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB;
175-INSERT INTO t2 VALUES (1, 1);
176-INSERT INTO t2 VALUES (2, 2);
177-COMMIT;
178-
179-let $t2_checksum_1= `CHECKSUM TABLE t2 EXTENDED`;
180-let $innodb_rows_deleted_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
181-let $innodb_rows_updated_1= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
182-let $table_rows_estimate_1= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
183-let $table_rows_changed_1= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
184-let $table_rows_changed_x_indexes_1= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
185-
186-SET innodb_fake_changes=1;
187-DELETE FROM t1 WHERE a=1;
188-UPDATE t1 SET a=3 WHERE a=2;
189---error 1180
190-COMMIT;
191-
192-let $t2_checksum_2= `CHECKSUM TABLE t2 EXTENDED`;
193-let $innodb_rows_deleted_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_deleted'`;
194-let $innodb_rows_updated_2= `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Innodb_rows_updated'`;
195-let $table_rows_estimate_2= `SELECT ROWS FROM INFORMATION_SCHEMA.INNODB_TABLE_STATS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
196-let $table_rows_changed_2= `SELECT ROWS_CHANGED FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
197-let $table_rows_changed_x_indexes_2= `SELECT ROWS_CHANGED_X_INDEXES FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_SCHEMA LIKE 'test' AND TABLE_NAME LIKE 't2'`;
198-
199---disable_query_log
200-eval SELECT "$t2_checksum_1" LIKE "$t2_checksum_2" AS should_be_1;
201-eval SELECT "$innodb_rows_deleted_2" - "$innodb_rows_deleted_1" AS should_be_0;
202-eval SELECT "$innodb_rows_updated_2" - "$innodb_rows_updated_1" AS should_be_0;
203-eval SELECT "$table_rows_estimate_2" - "$table_rows_estimate_1" AS should_be_0;
204-eval SELECT "$table_rows_changed_2" - "$table_rows_changed_1" AS should_be_0;
205-eval SELECT "$table_rows_changed_x_indexes_2" - "$table_rows_changed_x_indexes_1" AS should_be_0;
206---enable_query_log
207-
208-SET innodb_fake_changes=0;
209-DROP TABLE t2;
210-
211-# Test for bug 890404: uninitialized value warning in btr_cur_pessimistic_update
212-CREATE TABLE t3 (a INT primary key, b text) ENGINE=InnoDB;
213-INSERT INTO t3 VALUES (1,'');
214-COMMIT;
215-let $t3_checksum_1= `CHECKSUM TABLE t3 EXTENDED`;
216-SET innodb_fake_changes=1;
217-
218-UPDATE t3 set b=lpad('b',11000,'c') where a=1;
219---error ER_ERROR_DURING_COMMIT
220-COMMIT;
221-
222-SET innodb_fake_changes=default;
223---echo # Verify that the fake changes to t3 did not leak through
224-CHECK TABLE t3;
225-let $t3_checksum_2= `CHECKSUM TABLE t3 EXTENDED`;
226---disable_query_log
227-eval SELECT "$t3_checksum_1" LIKE "$t3_checksum_2" AS should_be_1;
228---enable_query_log
229-DROP TABLE t1, t3;
230-
231-SET @@GLOBAL.userstat= default;
232
233=== modified file 'Percona-Server/storage/innobase/btr/btr0cur.c'
234--- Percona-Server/storage/innobase/btr/btr0cur.c 2012-10-29 08:57:31 +0000
235+++ Percona-Server/storage/innobase/btr/btr0cur.c 2012-10-29 08:57:32 +0000
236@@ -239,6 +239,7 @@
237 mtr_t* mtr) /*!< in: mtr */
238 {
239 ulint mode;
240+ ulint sibling_mode;
241 ulint left_page_no;
242 ulint right_page_no;
243 buf_block_t* get_block;
244@@ -261,14 +262,21 @@
245 #endif /* UNIV_BTR_DEBUG */
246 get_block->check_index_page_at_flush = TRUE;
247 return;
248+ case BTR_SEARCH_TREE:
249 case BTR_MODIFY_TREE:
250- /* x-latch also brothers from left to right */
251+ if (UNIV_UNLIKELY(latch_mode == BTR_SEARCH_TREE)) {
252+ mode = RW_S_LATCH;
253+ sibling_mode = RW_NO_LATCH;
254+ } else {
255+ mode = sibling_mode = RW_X_LATCH;
256+ }
257+ /* Fetch and possibly latch also brothers from left to right */
258 left_page_no = btr_page_get_prev(page, mtr);
259
260 if (left_page_no != FIL_NULL) {
261 get_block = btr_block_get(
262 space, zip_size, left_page_no,
263- RW_X_LATCH, cursor->index, mtr);
264+ sibling_mode, cursor->index, mtr);
265
266 if (srv_pass_corrupt_table && !get_block) {
267 return;
268@@ -280,12 +288,21 @@
269 ut_a(btr_page_get_next(get_block->frame, mtr)
270 == page_get_page_no(page));
271 #endif /* UNIV_BTR_DEBUG */
272- get_block->check_index_page_at_flush = TRUE;
273+ if (sibling_mode == RW_NO_LATCH) {
274+ /* btr_block_get() called with RW_NO_LATCH will
275+ fix the read block in the buffer. This serves
276+ no purpose for the fake changes prefetching,
277+ thus we unfix the sibling blocks immediately.*/
278+ mtr_memo_release(mtr, get_block,
279+ MTR_MEMO_BUF_FIX);
280+ } else {
281+ get_block->check_index_page_at_flush = TRUE;
282+ }
283 }
284
285 get_block = btr_block_get(
286 space, zip_size, page_no,
287- RW_X_LATCH, cursor->index, mtr);
288+ mode, cursor->index, mtr);
289
290 if (srv_pass_corrupt_table && !get_block) {
291 return;
292@@ -301,7 +318,7 @@
293 if (right_page_no != FIL_NULL) {
294 get_block = btr_block_get(
295 space, zip_size, right_page_no,
296- RW_X_LATCH, cursor->index, mtr);
297+ sibling_mode, cursor->index, mtr);
298
299 if (srv_pass_corrupt_table && !get_block) {
300 return;
301@@ -313,7 +330,12 @@
302 ut_a(btr_page_get_prev(get_block->frame, mtr)
303 == page_get_page_no(page));
304 #endif /* UNIV_BTR_DEBUG */
305- get_block->check_index_page_at_flush = TRUE;
306+ if (sibling_mode == RW_NO_LATCH) {
307+ mtr_memo_release(mtr, get_block,
308+ MTR_MEMO_BUF_FIX);
309+ } else {
310+ get_block->check_index_page_at_flush = TRUE;
311+ }
312 }
313
314 return;
315
316=== modified file 'Percona-Server/storage/innobase/include/btr0btr.h'
317--- Percona-Server/storage/innobase/include/btr0btr.h 2012-08-07 06:10:00 +0000
318+++ Percona-Server/storage/innobase/include/btr0btr.h 2012-10-29 08:57:32 +0000
319@@ -65,7 +65,10 @@
320 /** Search the previous record. */
321 BTR_SEARCH_PREV = 35,
322 /** Modify the previous record. */
323- BTR_MODIFY_PREV = 36
324+ BTR_MODIFY_PREV = 36,
325+ /** Weaker BTR_MODIFY_TREE that does not lock the leaf page siblings,
326+ used for fake changes. */
327+ BTR_SEARCH_TREE = 37 /* BTR_MODIFY_TREE | 4 */
328 };
329
330 /* BTR_INSERT, BTR_DELETE and BTR_DELETE_MARK are mutually exclusive. */
331
332=== modified file 'Percona-Server/storage/innobase/row/row0ins.c'
333--- Percona-Server/storage/innobase/row/row0ins.c 2012-10-17 03:47:45 +0000
334+++ Percona-Server/storage/innobase/row/row0ins.c 2012-10-29 08:57:32 +0000
335@@ -2012,7 +2012,10 @@
336 the function will return in both low_match and up_match of the
337 cursor sensible values */
338
339- if (dict_index_is_clust(index)) {
340+ if (UNIV_UNLIKELY(thr_get_trx(thr)->fake_changes)) {
341+ search_mode = (mode & BTR_MODIFY_TREE)
342+ ? BTR_SEARCH_TREE : BTR_SEARCH_LEAF;
343+ } else if (dict_index_is_clust(index)) {
344 search_mode = mode;
345 } else if (!(thr_get_trx(thr)->check_unique_secondary)) {
346 search_mode = mode | BTR_INSERT | BTR_IGNORE_SEC_UNIQUE;
347@@ -2021,7 +2024,7 @@
348 }
349
350 btr_cur_search_to_nth_level(index, 0, entry, PAGE_CUR_LE,
351- thr_get_trx(thr)->fake_changes ? BTR_SEARCH_LEAF : search_mode,
352+ search_mode,
353 &cursor, 0, __FILE__, __LINE__, &mtr);
354
355 if (cursor.flag == BTR_CUR_INSERT_TO_IBUF) {
356
357=== modified file 'Percona-Server/storage/innobase/row/row0upd.c'
358--- Percona-Server/storage/innobase/row/row0upd.c 2012-05-10 07:49:14 +0000
359+++ Percona-Server/storage/innobase/row/row0upd.c 2012-10-29 08:57:32 +0000
360@@ -2018,7 +2018,8 @@
361 the same transaction do not modify the record in the meantime.
362 Therefore we can assert that the restoration of the cursor succeeds. */
363
364- ut_a(btr_pcur_restore_position(thr_get_trx(thr)->fake_changes ? BTR_SEARCH_LEAF : BTR_MODIFY_TREE,
365+ ut_a(btr_pcur_restore_position(thr_get_trx(thr)->fake_changes
366+ ? BTR_SEARCH_TREE : BTR_MODIFY_TREE,
367 pcur, mtr));
368
369 ut_ad(!rec_get_deleted_flag(btr_pcur_get_rec(pcur),

Subscribers

People subscribed via source and target branches