mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-5492 - Reduce usage of LOCK_open: TABLE::in_use
Move TABLE::in_use out of LOCK_open. This is done with assumtion that foreign threads accessing TABLE::in_use will only need consistent value _after_ marking table for flush and purging unused table instances. In this case TABLE::in_use will always point to a valid thread object. Previously FLUSH TABLES thread may wait for tables flushed subsequently by concurrent threads which breaks the above assumption, e.g.: open tables: t1 (version= 1) thr1 (FLUSH TABLES): refresh_version++ thr1 (FLUSH TABLES): purge table cache open tables: none thr2 (SELECT * FROM t1): open tables: t1 open tables: t1 (version= 2) thr2 (FLUSH TABLES): refresh_version++ thr2 (FLUSH TABLES): purge table cache thr1 (FLUSH TABLES): wait for old tables (including t1 with version 2) It is fixed so that FLUSH TABLES waits only for tables that were open heretofore.
This commit is contained in:
@ -47,13 +47,14 @@ extern bool tdc_remove_table(THD *thd, enum_tdc_remove_table_type remove_type,
|
||||
bool kill_delayed_threads);
|
||||
extern int tdc_wait_for_old_version(THD *thd, const char *db,
|
||||
const char *table_name,
|
||||
ulong wait_timeout, uint deadlock_weight);
|
||||
ulong wait_timeout, uint deadlock_weight,
|
||||
ulong refresh_version= ULONG_MAX);
|
||||
extern ulong tdc_refresh_version(void);
|
||||
extern void tdc_increment_refresh_version(void);
|
||||
extern ulong tdc_increment_refresh_version(void);
|
||||
extern void tdc_assign_new_table_id(TABLE_SHARE *share);
|
||||
|
||||
extern uint tc_records(void);
|
||||
extern void tc_purge(void);
|
||||
extern void tc_purge(bool mark_flushed= false);
|
||||
extern void tc_add_table(THD *thd, TABLE *table);
|
||||
extern bool tc_release_table(TABLE *table);
|
||||
|
||||
|
Reference in New Issue
Block a user