Skip to content

Commit

Permalink
MDEV-18154 Deadlock and assertion upon no-op ALTER under LOCK TABLES
Browse files Browse the repository at this point in the history
1. Revert incorrect treatment of m_needs_reopen;
2. Close single instance of TABLE instead of all instances since
   reopened only those that are marked for reopen.
  • Loading branch information
midenok committed Aug 16, 2019
1 parent 395e1dc commit 1639873
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
13 changes: 10 additions & 3 deletions sql/sql_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2488,9 +2488,16 @@ Locked_tables_list::reopen_tables(THD *thd, bool need_reopen)
{
if (!table_list->table || !table_list->table->needs_reopen())
continue;
/* no need to remove the table from the TDC here, thus (TABLE*)1 */
close_all_tables_for_name(thd, table_list->table->s,
HA_EXTRA_NOT_USED, (TABLE*)1);
for (TABLE **prev= &thd->open_tables; *prev; prev= &(*prev)->next)
{
if (*prev == table_list->table)
{
thd->locked_tables_list.unlink_from_list(thd, table_list, false);
mysql_lock_remove(thd, thd->lock, *prev);
close_thread_table(thd, prev);
break;
}
}
DBUG_ASSERT(table_list->table == NULL);
}
else
Expand Down
3 changes: 0 additions & 3 deletions sql/sql_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7831,7 +7831,6 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
Create_field *def;
Field **f_ptr,*field;
MY_BITMAP *dropped_fields= NULL; // if it's NULL - no dropped fields
bool save_reopen= table->m_needs_reopen;
DBUG_ENTER("mysql_prepare_alter_table");

/*
Expand Down Expand Up @@ -8511,9 +8510,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
alter_info->create_list.swap(new_create_list);
alter_info->key_list.swap(new_key_list);
alter_info->check_constraint_list.swap(new_constraint_list);
DBUG_RETURN(rc);
err:
table->m_needs_reopen= save_reopen;
DBUG_RETURN(rc);
}

Expand Down

0 comments on commit 1639873

Please sign in to comment.