mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-24351: S3, same-backend replication: Dropping a table on master...
..causes error on slave. Cause: if the master doesn't have the frm file for the table, DROP TABLE code will call ha_delete_table_force() to drop the table in all available storage engines. The issue was that this code path didn't check for HTON_TABLE_MAY_NOT_EXIST_ON_SLAVE flag for the storage engine, and so did not add "... IF EXISTS" to the statement that's written to the binary log. This can cause error on the slave when it tries to drop a table that's already gone.
This commit is contained in:
@ -2424,6 +2424,7 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
// note that for TABLE_TYPE_VIEW and TABLE_TYPE_UNKNOWN hton == NULL
|
||||
}
|
||||
|
||||
thd->replication_flags= 0;
|
||||
was_view= table_type == TABLE_TYPE_VIEW;
|
||||
if ((table_type == TABLE_TYPE_UNKNOWN) || (was_view && !drop_view) ||
|
||||
(table_type != TABLE_TYPE_SEQUENCE && drop_sequence))
|
||||
@ -2473,7 +2474,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
if (hton && hton->flags & HTON_TABLE_MAY_NOT_EXIST_ON_SLAVE)
|
||||
log_if_exists= 1;
|
||||
|
||||
thd->replication_flags= 0;
|
||||
bool enoent_warning= !dont_log_query && !(hton && hton->discover_table);
|
||||
error= ha_delete_table(thd, hton, path, &db, &table_name, enoent_warning);
|
||||
|
||||
@ -2489,9 +2489,6 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
/* This may be set by the storage engine in handler::delete_table() */
|
||||
if (thd->replication_flags & OPTION_IF_EXISTS)
|
||||
log_if_exists= 1;
|
||||
|
||||
/*
|
||||
Delete the .frm file if we managed to delete the table from the
|
||||
@ -2569,6 +2566,16 @@ int mysql_rm_table_no_locks(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
error= ferror;
|
||||
}
|
||||
|
||||
/*
|
||||
This may be set
|
||||
- by the storage engine in handler::delete_table()
|
||||
- when deleting a table without .frm file: delete_table_force() will
|
||||
check if the storage engine that had the table had
|
||||
HTON_TABLE_MAY_NOT_EXIST_ON_SLAVE flag
|
||||
*/
|
||||
if (thd->replication_flags & OPTION_IF_EXISTS)
|
||||
log_if_exists= 1;
|
||||
|
||||
if (likely(!error) || non_existing_table_error(error))
|
||||
{
|
||||
if (Table_triggers_list::drop_all_triggers(thd, &db, &table_name,
|
||||
|
Reference in New Issue
Block a user