mirror of
https://github.com/MariaDB/server.git
synced 2025-08-31 22:22:30 +03:00
locks for DML statements and changes the way MDL locks are acquired/granted in contended case. Instead of backing-off when a lock conflict is encountered and waiting for it to go away before restarting open_tables() process we now wait for lock to be released without releasing any previously acquired locks. If conflicting lock goes away we resume opening tables. If waiting leads to a deadlock we try to resolve it by backing-off and restarting open_tables() immediately. As result both waiting for possibility to acquire and acquiring of a metadata lock now always happen within the same MDL API call. This has allowed to make release of a lock and granting it to the most appropriate pending request an atomic operation. Thanks to this it became possible to wake up during release of lock only those waiters which requests can be satisfied at the moment as well as wake up only one waiter in case when granting its request would prevent all other requests from being satisfied. This solves thundering herd problem which occured in cases when we were releasing some lock and woke up many waiters for SNRW or X locks (this was the issue in bug#52289 "performance regression for MyISAM in sysbench OLTP_RW test". This also allowed to implement more fair (FIFO) scheduling among waiters with the same priority. It also opens the door for introducing new types of requests for metadata locks such as low-prio SNRW lock which is necessary in order to support LOCK TABLES LOW_PRIORITY WRITE. Notice that after this sometimes can report ER_LOCK_DEADLOCK error in cases in which it has not happened before. Particularly we will always report this error if waiting for conflicting lock has happened in the middle of transaction and resulted in a deadlock. Before this patch the error was not reported if deadlock could have been resolved by backing off all metadata locks acquired by the current statement.
75 lines
3.2 KiB
Plaintext
75 lines
3.2 KiB
Plaintext
select * from performance_schema.SETUP_INSTRUMENTS;
|
|
select * from performance_schema.SETUP_INSTRUMENTS
|
|
where name like 'Wait/Synch/Mutex/sql/%'
|
|
and name not in ('wait/synch/mutex/sql/DEBUG_SYNC::mutex')
|
|
order by name limit 10;
|
|
NAME ENABLED TIMED
|
|
wait/synch/mutex/sql/Cversion_lock YES YES
|
|
wait/synch/mutex/sql/Delayed_insert::mutex YES YES
|
|
wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state YES YES
|
|
wait/synch/mutex/sql/hash_filo::lock YES YES
|
|
wait/synch/mutex/sql/HA_DATA_PARTITION::LOCK_auto_inc YES YES
|
|
wait/synch/mutex/sql/LOCK_active_mi YES YES
|
|
wait/synch/mutex/sql/LOCK_audit_mask YES YES
|
|
wait/synch/mutex/sql/LOCK_connection_count YES YES
|
|
wait/synch/mutex/sql/LOCK_crypt YES YES
|
|
wait/synch/mutex/sql/LOCK_delayed_create YES YES
|
|
select * from performance_schema.SETUP_INSTRUMENTS
|
|
where name like 'Wait/Synch/Rwlock/sql/%'
|
|
and name not in ('wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock')
|
|
order by name limit 10;
|
|
NAME ENABLED TIMED
|
|
wait/synch/rwlock/sql/LOCK_dboptions YES YES
|
|
wait/synch/rwlock/sql/LOCK_grant YES YES
|
|
wait/synch/rwlock/sql/LOCK_system_variables_hash YES YES
|
|
wait/synch/rwlock/sql/LOCK_sys_init_connect YES YES
|
|
wait/synch/rwlock/sql/LOCK_sys_init_slave YES YES
|
|
wait/synch/rwlock/sql/LOGGER::LOCK_logger YES YES
|
|
wait/synch/rwlock/sql/MDL_context::LOCK_waiting_for YES YES
|
|
wait/synch/rwlock/sql/MDL_lock::rwlock YES YES
|
|
wait/synch/rwlock/sql/Query_cache_query::lock YES YES
|
|
wait/synch/rwlock/sql/THR_LOCK_servers YES YES
|
|
select * from performance_schema.SETUP_INSTRUMENTS
|
|
where name like 'Wait/Synch/Cond/sql/%'
|
|
and name not in (
|
|
'wait/synch/cond/sql/COND_handler_count',
|
|
'wait/synch/cond/sql/DEBUG_SYNC::cond')
|
|
order by name limit 10;
|
|
NAME ENABLED TIMED
|
|
wait/synch/cond/sql/COND_flush_thread_cache YES YES
|
|
wait/synch/cond/sql/COND_global_read_lock YES YES
|
|
wait/synch/cond/sql/COND_manager YES YES
|
|
wait/synch/cond/sql/COND_queue_state YES YES
|
|
wait/synch/cond/sql/COND_refresh YES YES
|
|
wait/synch/cond/sql/COND_rpl_status YES YES
|
|
wait/synch/cond/sql/COND_server_started YES YES
|
|
wait/synch/cond/sql/COND_thread_cache YES YES
|
|
wait/synch/cond/sql/COND_thread_count YES YES
|
|
wait/synch/cond/sql/Delayed_insert::cond YES YES
|
|
select * from performance_schema.SETUP_INSTRUMENTS
|
|
where name='Wait';
|
|
select * from performance_schema.SETUP_INSTRUMENTS
|
|
where enabled='YES';
|
|
insert into performance_schema.SETUP_INSTRUMENTS
|
|
set name='FOO', enabled='YES', timed='YES';
|
|
ERROR 42000: INSERT command denied to user 'root'@'localhost' for table 'SETUP_INSTRUMENTS'
|
|
update performance_schema.SETUP_INSTRUMENTS
|
|
set name='FOO';
|
|
ERROR HY000: Invalid performance_schema usage.
|
|
update performance_schema.SETUP_INSTRUMENTS
|
|
set enabled='NO';
|
|
update performance_schema.SETUP_INSTRUMENTS
|
|
set timed='NO';
|
|
select * from performance_schema.SETUP_INSTRUMENTS;
|
|
update performance_schema.SETUP_INSTRUMENTS
|
|
set enabled='YES', timed='YES';
|
|
delete from performance_schema.SETUP_INSTRUMENTS;
|
|
ERROR 42000: DELETE command denied to user 'root'@'localhost' for table 'SETUP_INSTRUMENTS'
|
|
delete from performance_schema.SETUP_INSTRUMENTS
|
|
where name like 'Wait/Synch/%';
|
|
ERROR 42000: DELETE command denied to user 'root'@'localhost' for table 'SETUP_INSTRUMENTS'
|
|
LOCK TABLES performance_schema.SETUP_INSTRUMENTS READ;
|
|
UNLOCK TABLES;
|
|
LOCK TABLES performance_schema.SETUP_INSTRUMENTS WRITE;
|
|
UNLOCK TABLES;
|