mirror of
https://github.com/MariaDB/server.git
synced 2025-11-12 16:56:15 +01:00
The function ibuf_remove_free_page() was waiting for ibuf_mutex while holding ibuf.index->lock. This constitutes a lock order inversion and may cause InnoDB to hang when innodb_change_buffering is enabled and ibuf_merge_or_delete_for_page() is being executed concurrently. In fact, there is no need for ibuf_remove_free_page() to reacquire ibuf_mutex if we make ibuf.seg_size and ibuf.free_list_len protected by the ibuf.index->lock as well as the root page latch rather than by ibuf_mutex. ibuf.seg_size, ibuf.free_list_len: Instead of ibuf_mutex, let the ibuf.index->lock and the root page latch protect these, like ibuf.empty. ibuf_init_at_db_start(): Acquire the root page latch before updating ibuf.seg_size. (The ibuf.index would be created later.) ibuf_data_enough_free_for_insert(), ibuf_data_too_much_free(): Assert also ibuf.index->lock.have_u_or_x(). ibuf_remove_free_page(): Acquire the ibuf.index->lock and the root page latch before accessing ibuf.free_list_len. Simplify the way how the root page latch is released and reacquired. Acquire and release ibuf_mutex only once. ibuf_free_excess_pages(), ibuf_insert_low(): Acquire also ibuf.index->lock before reading ibuf.free_list_len. ibuf_print(): Acquire ibuf.index->lock before reading ibuf.free_list_len and ibuf.seg_size. Reviewed by: Vladislav Lesin Tested by: Matthias Leich |
||
|---|---|---|
| .. | ||
| archive | ||
| blackhole | ||
| columnstore | ||
| connect | ||
| csv | ||
| example | ||
| federated | ||
| federatedx | ||
| heap | ||
| innobase | ||
| maria | ||
| mroonga | ||
| myisam | ||
| myisammrg | ||
| oqgraph | ||
| perfschema | ||
| rocksdb | ||
| sequence | ||
| sphinx | ||
| spider | ||
| test_sql_discovery | ||