Commit 14e13856 authored by Sergey Vojtovich's avatar Sergey Vojtovich

Proper locking for mysql.gtid_slave_pos truncation

Aim of this patch is to remove tdc_remove_table(TDC_RT_REMOVE_UNUSED),
which was mistakenly introduced by 055a3334.

InnoDB allows only one open TABLE instance while performing table
truncation. To fulfill this requirement:
1. MDL_EXCLUSIVE has to be acquired to block concurrent threads from
   accessing given table
2. cached TABLE instances have to be flushed
3. another InnoDB requirement is such that TABLE_SHARE and remaining
   TABLE instance have to be invalidated and re-opened after truncation

This goes more or less inline with what regular TRUNCATE TABLE does.

Alternative solution would be handler::ha_delete_all_rows(), but InnoDB
doesn't implement it unfortunately.

Part of MDEV-17882 - Cleanup refresh version
parent bfdd30d3
......@@ -425,11 +425,12 @@ rpl_slave_state::truncate_state_table(THD *thd)
tlist.init_one_table(&MYSQL_SCHEMA_NAME, &rpl_gtid_slave_state_table_name,
NULL, TL_WRITE);
tlist.mdl_request.set_type(MDL_EXCLUSIVE);
if (!(err= open_and_lock_tables(thd, &tlist, FALSE,
MYSQL_OPEN_IGNORE_LOGGING_FORMAT)))
{
DBUG_ASSERT(!tlist.table->file->row_logging);
tdc_remove_table(thd, TDC_RT_REMOVE_UNUSED, "mysql",
tdc_remove_table(thd, TDC_RT_REMOVE_NOT_OWN, "mysql",
rpl_gtid_slave_state_table_name.str);
err= tlist.table->file->ha_truncate();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment