Non-blocking "set read_only"

Description

It can be dangerous to run "set read_only" on a production server because it can block in close_cached_tables. More details about the pain this caused previously are at:
http://mysqlha.blogspot.com/2008/07/what-exactly-does-flush-tables-with.html

Per the code in set_var.cc:

1 2 3 4 5 6 7 8 9 10 /* Perform a 'FLUSH TABLES WITH READ LOCK'. This is a 3 step process: - [1] lock_global_read_lock() - [2] close_cached_tables() - [3] make_global_read_lock_block_commit() [1] prevents new connections from obtaining tables locked for write. [2] waits until all existing connections close their tables. [3] prevents transactions from being committed. */

Can there be a variant that doesn't do #2? My workload doesn't use MyISAM and I don't know if #2 is done because of MyISAM. Calling close_cached_tables seems like a heavy way to force LOCK TABLEs to be unlocked. Any long running queries will cause #2 to block.

See also http://lists.mysql.com/commits/142825

Environment

None

Status

Assignee

Alexey Botchkov

Reporter

Rasmus Johansson

Labels

External issue ID

None

External issue ID

None

Time tracking

16h

Fix versions

Due date

2012/05/16

Priority

Major
Configure