mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MySQL WL#5522 - InnoDB transportable tablespaces.
Cleanups: * remove unused HA_EXTRA_EXPORT (can be added later if needed, e.g. for Aria) * clarify the meaning of HA_CAN_EXPORT * make all engines that support EXPORT to announce it * reduce code duplication
This commit is contained in:
@ -407,7 +407,8 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options,
|
||||
|
||||
|
||||
/**
|
||||
Implementation of FLUSH TABLES <table_list> WITH READ LOCK.
|
||||
Implementation of FLUSH TABLES <table_list> WITH READ LOCK
|
||||
and FLUSH TABLES <table_list> FOR EXPORT
|
||||
|
||||
In brief: take exclusive locks, expel tables from the table
|
||||
cache, reopen the tables, enter the 'LOCKED TABLES' mode,
|
||||
@ -496,27 +497,30 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/*
|
||||
Acquire SNW locks on tables to be flushed. Don't acquire global
|
||||
IX and database-scope IX locks on the tables as this will make
|
||||
this statement incompatible with FLUSH TABLES WITH READ LOCK.
|
||||
*/
|
||||
if (lock_table_names(thd, all_tables, NULL,
|
||||
thd->variables.lock_wait_timeout,
|
||||
MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK))
|
||||
goto error;
|
||||
|
||||
DEBUG_SYNC(thd,"flush_tables_with_read_lock_after_acquire_locks");
|
||||
|
||||
for (table_list= all_tables; table_list;
|
||||
table_list= table_list->next_global)
|
||||
if (thd->lex->type & REFRESH_READ_LOCK)
|
||||
{
|
||||
/* Request removal of table from cache. */
|
||||
tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED,
|
||||
table_list->db,
|
||||
table_list->table_name, FALSE);
|
||||
/* Reset ticket to satisfy asserts in open_tables(). */
|
||||
table_list->mdl_request.ticket= NULL;
|
||||
/*
|
||||
Acquire SNW locks on tables to be flushed. Don't acquire global
|
||||
IX and database-scope IX locks on the tables as this will make
|
||||
this statement incompatible with FLUSH TABLES WITH READ LOCK.
|
||||
*/
|
||||
if (lock_table_names(thd, all_tables, NULL,
|
||||
thd->variables.lock_wait_timeout,
|
||||
MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK))
|
||||
goto error;
|
||||
|
||||
DEBUG_SYNC(thd,"flush_tables_with_read_lock_after_acquire_locks");
|
||||
|
||||
for (table_list= all_tables; table_list;
|
||||
table_list= table_list->next_global)
|
||||
{
|
||||
/* Request removal of table from cache. */
|
||||
tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED,
|
||||
table_list->db,
|
||||
table_list->table_name, FALSE);
|
||||
/* Reset ticket to satisfy asserts in open_tables(). */
|
||||
table_list->mdl_request.ticket= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -531,11 +535,27 @@ bool flush_tables_with_read_lock(THD *thd, TABLE_LIST *all_tables)
|
||||
*/
|
||||
if (open_and_lock_tables(thd, all_tables, FALSE,
|
||||
MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK,
|
||||
&lock_tables_prelocking_strategy) ||
|
||||
thd->locked_tables_list.init_locked_tables(thd))
|
||||
{
|
||||
&lock_tables_prelocking_strategy))
|
||||
goto error;
|
||||
|
||||
if (thd->lex->type & REFRESH_FOR_EXPORT)
|
||||
{
|
||||
// Check if all storage engines support FOR EXPORT.
|
||||
for (TABLE_LIST *table_list= all_tables; table_list;
|
||||
table_list= table_list->next_global)
|
||||
{
|
||||
if (!(table_list->table->file->ha_table_flags() & HA_CAN_EXPORT))
|
||||
{
|
||||
my_error(ER_ILLEGAL_HA, MYF(0),table_list->table->file->table_type(),
|
||||
table_list->db, table_list->table_name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (thd->locked_tables_list.init_locked_tables(thd))
|
||||
goto error;
|
||||
|
||||
thd->variables.option_bits|= OPTION_TABLE_LOCK;
|
||||
|
||||
/*
|
||||
@ -552,85 +572,6 @@ error:
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Prepare tables for export (transportable tablespaces) by
|
||||
a) waiting until write transactions/DDL operations using these
|
||||
tables have completed.
|
||||
b) block new write operations/DDL operations on these tables.
|
||||
|
||||
Once this is done, notify the storage engines using handler::extra().
|
||||
|
||||
Finally, enter LOCK TABLES mode, so that locks are held
|
||||
until UNLOCK TABLES is executed.
|
||||
|
||||
@param thd Thread handler
|
||||
@param all_tables TABLE_LIST for tables to be exported
|
||||
|
||||
@retval false Ok
|
||||
@retval true Error
|
||||
*/
|
||||
|
||||
bool flush_tables_for_export(THD *thd, TABLE_LIST *all_tables)
|
||||
{
|
||||
Lock_tables_prelocking_strategy lock_tables_prelocking_strategy;
|
||||
|
||||
/*
|
||||
This is called from SQLCOM_FLUSH, the transaction has
|
||||
been committed implicitly.
|
||||
*/
|
||||
|
||||
if (thd->locked_tables_mode)
|
||||
{
|
||||
my_error(ER_LOCK_OR_ACTIVE_TRANSACTION, MYF(0));
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
Acquire SNW locks on tables to be exported. Don't acquire
|
||||
global IX as this will make this statement incompatible
|
||||
with FLUSH TABLES WITH READ LOCK.
|
||||
*/
|
||||
if (open_and_lock_tables(thd, all_tables, false,
|
||||
MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK,
|
||||
&lock_tables_prelocking_strategy))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check if all storage engines support FOR EXPORT.
|
||||
for (TABLE_LIST *table_list= all_tables; table_list;
|
||||
table_list= table_list->next_global)
|
||||
{
|
||||
if (!(table_list->table->file->ha_table_flags() & HA_CAN_EXPORT))
|
||||
{
|
||||
my_error(ER_ILLEGAL_HA, MYF(0),table_list->table->file->table_type(),
|
||||
table_list->db, table_list->table_name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Notify the storage engines that the tables should be made ready for export.
|
||||
for (TABLE_LIST *table_list= all_tables; table_list;
|
||||
table_list= table_list->next_global)
|
||||
{
|
||||
handler *handler_file= table_list->table->file;
|
||||
int error= handler_file->extra(HA_EXTRA_EXPORT);
|
||||
if (error)
|
||||
{
|
||||
handler_file->print_error(error, MYF(0));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Enter LOCKED TABLES mode.
|
||||
if (thd->locked_tables_list.init_locked_tables(thd))
|
||||
return true;
|
||||
thd->variables.option_bits|= OPTION_TABLE_LOCK;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Disable checkpoints for all handlers
|
||||
This is released in unlock_global_read_lock()
|
||||
|
Reference in New Issue
Block a user