mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Backport of:
---------------------------------------------------------- revno: 2630.10.1 committer: Konstantin Osipov <konstantin@mysql.com> branch nick: mysql-6.0-lock-tables-tidyup timestamp: Wed 2008-06-11 15:49:58 +0400 message: WL#3726, review fixes. Now that we have metadata locks, we don't need to keep a crippled TABLE instance in the table cache to indicate that a table is locked. Remove all code that used this technique. Instead, rely on metadata locks and use the standard open_table() and close_thread_table() to manipulate with the table cache tables. Removes a list of functions that have become unused (see the comment for sql_base.cc for details). Under LOCK TABLES, keep a TABLE_LIST instance for each table that may be temporarily closed. For that, implement an own class for LOCK TABLES mode, Locked_tables_list. This is a pre-requisite patch for WL#4144. This is not exactly a backport: there is no new online ALTER table in Celosia, so the old alter table code was changed to work with the new table cache API. mysql-test/r/lock.result: Update results (WL#3726 post-review patch). mysql-test/r/trigger-compat.result: We take the table from the table cache now, thus no warning. mysql-test/suite/rpl/r/rpl_trigger.result: We take the table from the table cache now, thus no warning. mysql-test/t/lock.test: Additional tests for LOCK TABLES mode (previously not covered by the test suite (WL#3726). sql/field.h: Remove reopen_table(). sql/lock.cc: Remove an obsolete parameter of mysql_lock_remove(). It's not used anywhere now either. sql/mysql_priv.h: Add 4 new open_table() flags. Remove declarations of removed functions. sql/sp_head.cc: Rename thd->mdl_el_root to thd->locked_tables_root. sql/sql_acl.cc: Use the new implementation of unlock_locked_tables(). sql/sql_base.cc: Implement class Locked_tables_list. Implement close_all_tables_for_name(). Rewrite close_cached_tables() to use the new reopen_tables(). Remove reopen_table(), reopen_tables(), reopen_table_entry() (ex. open_unireg_entry()), close_data_files_and_leave_as_placeholders(), close_handle_and_leave_table_as_placeholder(), close_cached_table(), table_def_change_share(), reattach_merge(), reopen_name_locked_table(), unlink_open_table(). Move acquisition of a metadata lock into an own function - open_table_get_mdl_lock(). sql/sql_class.cc: Deploy class Locked_tables_list. sql/sql_class.h: Declare class Locked_tables_list. Keep one instance of this class in class THD. Rename mdl_el_root to locked_tables_root. sql/sql_db.cc: Update a comment. sql/sql_insert.cc: Use the plain open_table() to open a just created table in CREATE TABLE .. SELECT. sql/sql_parse.cc: Use thd->locked_tables_list to enter and leave LTM_LOCK_TABLES mode. sql/sql_partition.cc: Deploy the new method of working with partitioned table locks. sql/sql_servers.cc: Update to the new signature of unlock_locked_tables(). sql/sql_table.cc: In mysql_rm_table_part2(), the branch that removes a table under LOCK TABLES, make sure that the table being dropped is also removed from THD::locked_tables_list. Update ALTER TABLE and CREATE TABLE LIKE implementation to use open_table() and close_all_tables_for_name() instead of reopen_tables(). sql/sql_trigger.cc: Use the new locking way. sql/table.h: Add TABLE::pos_in_locked_tables, which is used only under LOCK TABLES.
This commit is contained in:
@ -1169,6 +1169,58 @@ private:
|
||||
Internal_error_handler *m_err_handler;
|
||||
};
|
||||
|
||||
/**
|
||||
Tables that were locked with LOCK TABLES statement.
|
||||
|
||||
Encapsulates a list of TABLE_LIST instances for tables
|
||||
locked by LOCK TABLES statement, memory root for metadata locks,
|
||||
and, generally, the context of LOCK TABLES statement.
|
||||
|
||||
In LOCK TABLES mode, the locked tables are kept open between
|
||||
statements.
|
||||
Therefore, we can't allocate metadata locks on execution memory
|
||||
root -- as well as tables, the locks need to stay around till
|
||||
UNLOCK TABLES is called.
|
||||
The locks are allocated in the memory root encapsulate in this
|
||||
class.
|
||||
|
||||
Some SQL commands, like FLUSH TABLE or ALTER TABLE, demand that
|
||||
the tables they operate on are closed, at least temporarily.
|
||||
This class encapsulates a list of TABLE_LIST instances, one
|
||||
for each base table from LOCK TABLES list,
|
||||
which helps conveniently close the TABLEs when it's necessary
|
||||
and later reopen them.
|
||||
|
||||
Implemented in sql_base.cc
|
||||
*/
|
||||
|
||||
class Locked_tables_list
|
||||
{
|
||||
private:
|
||||
MEM_ROOT m_locked_tables_root;
|
||||
TABLE_LIST *m_locked_tables;
|
||||
TABLE_LIST **m_locked_tables_last;
|
||||
public:
|
||||
Locked_tables_list()
|
||||
:m_locked_tables(NULL),
|
||||
m_locked_tables_last(&m_locked_tables)
|
||||
{
|
||||
init_sql_alloc(&m_locked_tables_root, MEM_ROOT_BLOCK_SIZE, 0);
|
||||
}
|
||||
void unlock_locked_tables(THD *thd);
|
||||
~Locked_tables_list()
|
||||
{
|
||||
unlock_locked_tables(0);
|
||||
}
|
||||
bool init_locked_tables(THD *thd);
|
||||
TABLE_LIST *locked_tables() { return m_locked_tables; }
|
||||
MEM_ROOT *locked_tables_root() { return &m_locked_tables_root; }
|
||||
void unlink_from_list(THD *thd, TABLE_LIST *table_list,
|
||||
bool remove_from_locked_tables);
|
||||
void unlink_all_closed_tables();
|
||||
bool reopen_tables(THD *thd);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Storage engine specific thread local data.
|
||||
@ -1810,6 +1862,8 @@ public:
|
||||
*/
|
||||
Parser_state *m_parser_state;
|
||||
|
||||
Locked_tables_list locked_tables_list;
|
||||
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
partition_info *work_part_info;
|
||||
#endif
|
||||
@ -1819,8 +1873,13 @@ public:
|
||||
struct st_debug_sync_control *debug_sync_control;
|
||||
#endif /* defined(ENABLED_DEBUG_SYNC) */
|
||||
|
||||
MEM_ROOT *mdl_el_root;
|
||||
MEM_ROOT locked_tables_root;
|
||||
/**
|
||||
Points to the memory root of Locked_tables_list if
|
||||
we're locking the tables for LOCK TABLES. Otherwise is NULL.
|
||||
This is necessary to ensure that metadata locks allocated for
|
||||
tables used in triggers will persist after statement end.
|
||||
*/
|
||||
MEM_ROOT *locked_tables_root;
|
||||
|
||||
THD();
|
||||
~THD();
|
||||
|
Reference in New Issue
Block a user