Fake changes blocking real changes due to locking
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Percona Server moved to https://jira.percona.com/projects/PS |
Fix Released
|
High
|
Laurynas Biveinis | ||
5.1 |
Fix Released
|
High
|
Laurynas Biveinis | ||
5.5 |
Fix Released
|
High
|
Laurynas Biveinis |
Bug Description
Source:
https:/
Since fake changes may S-lock the touched rows, any concurrent updates that need to X lock the same rows will be blocked.
A testcase (adapted from Facebook branch rev 3771):
--source include/
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
SET autocommit=0;
SET innodb_
--echo # Confirm that fake UPDATE doesn't hold a lock
BEGIN;
SELECT * FROM t1 FOR UPDATE;
--connect (conn2,
--connection conn2
BEGIN;
UPDATE t1 SET a=3 WHERE a=1;
ROLLBACK;
--connection default
ROLLBACK;
SET innodb_
DROP TABLE t1;
Related branches
- Stewart Smith (community): Approve
-
Diff: 333 lines (+203/-14)8 files modifiedPercona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result (+68/-4)
Percona-Server/mysql-test/r/percona_server_variables_debug.result (+1/-0)
Percona-Server/mysql-test/r/percona_server_variables_release.result (+1/-0)
Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test (+103/-6)
Percona-Server/storage/innodb_plugin/handler/ha_innodb.cc (+8/-0)
Percona-Server/storage/innodb_plugin/include/srv0srv.h (+4/-0)
Percona-Server/storage/innodb_plugin/lock/lock0lock.c (+14/-4)
Percona-Server/storage/innodb_plugin/srv/srv0srv.c (+4/-0)
- Stewart Smith (community): Approve
-
Diff: 442 lines (+128/-122)11 files modifiedPercona-Server/mysql-test/r/percona_innodb_fake_changes_locks.result (+0/-19)
Percona-Server/mysql-test/r/percona_server_variables_debug.result (+1/-0)
Percona-Server/mysql-test/r/percona_server_variables_release.result (+1/-0)
Percona-Server/mysql-test/suite/sys_vars/r/innodb_locking_fake_changes_basic.result (+52/-0)
Percona-Server/mysql-test/suite/sys_vars/t/innodb_locking_fake_changes_basic.test (+44/-0)
Percona-Server/mysql-test/t/percona_innodb_fake_changes.test (+0/-75)
Percona-Server/mysql-test/t/percona_innodb_fake_changes_locks.test (+0/-24)
Percona-Server/storage/innobase/handler/ha_innodb.cc (+8/-0)
Percona-Server/storage/innobase/include/srv0srv.h (+4/-0)
Percona-Server/storage/innobase/lock/lock0lock.c (+14/-4)
Percona-Server/storage/innobase/srv/srv0srv.c (+4/-0)
One way to fix this is to follow FB implementation in revs 3771 and 3775.
An alternative perhaps would be to fix the issue addressed in rev 3775 (fake secondary index update failing in case no locks due to concurrent real update deleting the row) by making faking sec index updates to always succeed.