MDEV-21832 FORCE all partition to rebuild if any one of the

partition does rebuild

- In ha_innobase::commit_inplace_alter_table() assumes that all partition
should do the same kind of alter operations. During DDL, if one partition
requires table rebuild and other partition doesn't need rebuild
then all partition should be forced to rebuild.
This commit is contained in:
Thirunarayanan Balathandayuthapani 2020-03-27 16:32:34 +05:30 committed by Marko Mäkelä
parent 67f2782413
commit f8ec3ba01b
2 changed files with 29 additions and 25 deletions

View File

@ -9996,7 +9996,8 @@ ha_partition::check_if_supported_inplace_alter(TABLE *altered_table,
Alter_inplace_info *ha_alter_info)
{
uint index= 0;
enum_alter_inplace_result result= HA_ALTER_INPLACE_NO_LOCK;
enum_alter_inplace_result result;
alter_table_operations orig_ops;
ha_partition_inplace_ctx *part_inplace_ctx;
bool first_is_set= false;
THD *thd= ha_thd();
@ -10023,33 +10024,35 @@ ha_partition::check_if_supported_inplace_alter(TABLE *altered_table,
if (!part_inplace_ctx->handler_ctx_array)
DBUG_RETURN(HA_ALTER_ERROR);
/* Set all to NULL, including the terminating one. */
for (index= 0; index <= m_tot_parts; index++)
part_inplace_ctx->handler_ctx_array[index]= NULL;
do {
result= HA_ALTER_INPLACE_NO_LOCK;
/* Set all to NULL, including the terminating one. */
for (index= 0; index <= m_tot_parts; index++)
part_inplace_ctx->handler_ctx_array[index]= NULL;
ha_alter_info->handler_flags |= ALTER_PARTITIONED;
for (index= 0; index < m_tot_parts; index++)
{
enum_alter_inplace_result p_result=
m_file[index]->check_if_supported_inplace_alter(altered_table,
ha_alter_info);
part_inplace_ctx->handler_ctx_array[index]= ha_alter_info->handler_ctx;
ha_alter_info->handler_flags |= ALTER_PARTITIONED;
orig_ops= ha_alter_info->handler_flags;
for (index= 0; index < m_tot_parts; index++)
{
enum_alter_inplace_result p_result=
m_file[index]->check_if_supported_inplace_alter(altered_table,
ha_alter_info);
part_inplace_ctx->handler_ctx_array[index]= ha_alter_info->handler_ctx;
if (index == 0)
{
first_is_set= (ha_alter_info->handler_ctx != NULL);
if (index == 0)
first_is_set= (ha_alter_info->handler_ctx != NULL);
else if (first_is_set != (ha_alter_info->handler_ctx != NULL))
{
/* Either none or all partitions must set handler_ctx! */
DBUG_ASSERT(0);
DBUG_RETURN(HA_ALTER_ERROR);
}
if (p_result < result)
result= p_result;
if (result == HA_ALTER_ERROR)
break;
}
else if (first_is_set != (ha_alter_info->handler_ctx != NULL))
{
/* Either none or all partitions must set handler_ctx! */
DBUG_ASSERT(0);
DBUG_RETURN(HA_ALTER_ERROR);
}
if (p_result < result)
result= p_result;
if (result == HA_ALTER_ERROR)
break;
}
} while (orig_ops != ha_alter_info->handler_flags);
ha_alter_info->handler_ctx= part_inplace_ctx;
/*

View File

@ -1459,6 +1459,7 @@ cannot_create_many_fulltext_index:
}
if (need_rebuild || fts_need_rebuild) {
ha_alter_info->handler_flags |= ALTER_RECREATE_TABLE;
DBUG_RETURN(online
? HA_ALTER_INPLACE_COPY_NO_LOCK
: HA_ALTER_INPLACE_COPY_LOCK);