Commit d480d0ec authored by unknown's avatar unknown

Bug#30712 (open_performance_schema_table() cause an open table leak on

failures)

Fixed open_performance_schema_table() and close_performance_schema_table()
implementation and callers, to always execute balanced calls to:
  thd->reset_n_backup_open_tables_state(backup);
  thd->restore_backup_open_tables_state(backup);



sql/log.cc:
  Balanced calls to reset_n_backup_open_tables_state() / restore_backup_open_tables_state()
sql/sql_base.cc:
  Balanced calls to reset_n_backup_open_tables_state() / restore_backup_open_tables_state()
parent 85ebacfa
...@@ -656,8 +656,14 @@ int Log_to_csv_event_handler:: ...@@ -656,8 +656,14 @@ int Log_to_csv_event_handler::
table= open_performance_schema_table(thd, & table_list, table= open_performance_schema_table(thd, & table_list,
& open_tables_backup); & open_tables_backup);
result= (table ? 0 : 1); if (table)
close_performance_schema_table(thd, & open_tables_backup); {
result= 0;
close_performance_schema_table(thd, & open_tables_backup);
}
else
result= 1;
DBUG_RETURN(result); DBUG_RETURN(result);
} }
......
...@@ -7746,6 +7746,9 @@ open_performance_schema_table(THD *thd, TABLE_LIST *one_table, ...@@ -7746,6 +7746,9 @@ open_performance_schema_table(THD *thd, TABLE_LIST *one_table,
*/ */
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET; table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
} }
else
thd->restore_backup_open_tables_state(backup);
thd->utime_after_lock= save_utime_after_lock; thd->utime_after_lock= save_utime_after_lock;
DBUG_RETURN(table); DBUG_RETURN(table);
} }
...@@ -7761,24 +7764,25 @@ void close_performance_schema_table(THD *thd, Open_tables_state *backup) ...@@ -7761,24 +7764,25 @@ void close_performance_schema_table(THD *thd, Open_tables_state *backup)
{ {
bool found_old_table; bool found_old_table;
if (thd->lock) /*
{ If open_performance_schema_table() fails,
/* this function should not be called.
Note: */
We do not create explicitly a separate transaction for the DBUG_ASSERT(thd->lock != NULL);
performance table I/O, but borrow the current transaction.
lock + unlock will autocommit the change done in the
performance schema table: this is the expected result.
The current transaction should not be affected by this code.
TODO: Note that if a transactional engine is used for log tables,
this code will need to be revised, as a separate transaction
might be needed.
*/
mysql_unlock_tables(thd, thd->lock);
thd->lock= 0;
}
safe_mutex_assert_not_owner(&LOCK_open); /*
Note:
We do not create explicitly a separate transaction for the
performance table I/O, but borrow the current transaction.
lock + unlock will autocommit the change done in the
performance schema table: this is the expected result.
The current transaction should not be affected by this code.
TODO: Note that if a transactional engine is used for log tables,
this code will need to be revised, as a separate transaction
might be needed.
*/
mysql_unlock_tables(thd, thd->lock);
thd->lock= 0;
pthread_mutex_lock(&LOCK_open); pthread_mutex_lock(&LOCK_open);
......
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