dict0dict.h, dict0dict.c, row0mysql.c, ha_innobase.cc:

  Add some more safety if MySQL tries to drop a table on which there are open handles
parent c70be011
...@@ -195,21 +195,6 @@ dict_mutex_exit_for_mysql(void) ...@@ -195,21 +195,6 @@ dict_mutex_exit_for_mysql(void)
mutex_exit(&(dict_sys->mutex)); mutex_exit(&(dict_sys->mutex));
} }
/************************************************************************
Increments the count of open MySQL handles to a table. */
void
dict_table_increment_handle_count(
/*==============================*/
dict_table_t* table) /* in: table */
{
mutex_enter(&(dict_sys->mutex));
table->n_mysql_handles_opened++;
mutex_exit(&(dict_sys->mutex));
}
/************************************************************************ /************************************************************************
Decrements the count of open MySQL handles to a table. */ Decrements the count of open MySQL handles to a table. */
...@@ -495,6 +480,41 @@ dict_table_get( ...@@ -495,6 +480,41 @@ dict_table_get(
return(table); return(table);
} }
/**************************************************************************
Returns a table object and increments MySQL open handle count on the table.
*/
dict_table_t*
dict_table_get_and_increment_handle_count(
/*======================================*/
/* out: table, NULL if does not exist */
char* table_name, /* in: table name */
trx_t* trx) /* in: transaction handle or NULL */
{
dict_table_t* table;
UT_NOT_USED(trx);
mutex_enter(&(dict_sys->mutex));
table = dict_table_get_low(table_name);
if (table != NULL) {
table->n_mysql_handles_opened++;
}
mutex_exit(&(dict_sys->mutex));
if (table != NULL) {
if (!table->stat_initialized) {
dict_update_statistics(table);
}
}
return(table);
}
/************************************************************************** /**************************************************************************
Adds a table object to the dictionary cache. */ Adds a table object to the dictionary cache. */
......
...@@ -26,13 +26,6 @@ Created 1/8/1996 Heikki Tuuri ...@@ -26,13 +26,6 @@ Created 1/8/1996 Heikki Tuuri
#include "ut0byte.h" #include "ut0byte.h"
#include "trx0types.h" #include "trx0types.h"
/************************************************************************
Increments the count of open MySQL handles to a table. */
void
dict_table_increment_handle_count(
/*==============================*/
dict_table_t* table); /* in: table */
/************************************************************************ /************************************************************************
Decrements the count of open MySQL handles to a table. */ Decrements the count of open MySQL handles to a table. */
...@@ -195,6 +188,16 @@ dict_table_get( ...@@ -195,6 +188,16 @@ dict_table_get(
char* table_name, /* in: table name */ char* table_name, /* in: table name */
trx_t* trx); /* in: transaction handle */ trx_t* trx); /* in: transaction handle */
/************************************************************************** /**************************************************************************
Returns a table object and increments MySQL open handle count on the table.
*/
dict_table_t*
dict_table_get_and_increment_handle_count(
/*======================================*/
/* out: table, NULL if does not exist */
char* table_name, /* in: table name */
trx_t* trx); /* in: transaction handle or NULL */
/**************************************************************************
Returns a table object, based on table id, and memoryfixes it. */ Returns a table object, based on table id, and memoryfixes it. */
dict_table_t* dict_table_t*
......
...@@ -273,8 +273,6 @@ row_create_prebuilt( ...@@ -273,8 +273,6 @@ row_create_prebuilt(
ulint ref_len; ulint ref_len;
ulint i; ulint i;
dict_table_increment_handle_count(table);
heap = mem_heap_create(128); heap = mem_heap_create(128);
prebuilt = mem_heap_alloc(heap, sizeof(row_prebuilt_t)); prebuilt = mem_heap_alloc(heap, sizeof(row_prebuilt_t));
...@@ -1466,6 +1464,13 @@ loop: ...@@ -1466,6 +1464,13 @@ loop:
table = dict_table_get_low(drop->table_name); table = dict_table_get_low(drop->table_name);
mutex_exit(&(dict_sys->mutex)); mutex_exit(&(dict_sys->mutex));
if (table == NULL) {
/* If for some reason the table has already been dropped
through some other mechanism, do not try to drop it */
goto already_dropped;
}
if (table->n_mysql_handles_opened > 0) { if (table->n_mysql_handles_opened > 0) {
return(n_tables + n_tables_dropped); return(n_tables + n_tables_dropped);
...@@ -1475,10 +1480,16 @@ loop: ...@@ -1475,10 +1480,16 @@ loop:
row_drop_table_for_mysql_in_background(drop->table_name); row_drop_table_for_mysql_in_background(drop->table_name);
already_dropped:
mutex_enter(&kernel_mutex); mutex_enter(&kernel_mutex);
UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop);
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: Dropped table %s in background drop queue.\n",
drop->table_name);
mem_free(drop->table_name); mem_free(drop->table_name);
mem_free(drop); mem_free(drop);
...@@ -1741,6 +1752,13 @@ row_drop_table_for_mysql( ...@@ -1741,6 +1752,13 @@ row_drop_table_for_mysql(
if (table->n_mysql_handles_opened > 0) { if (table->n_mysql_handles_opened > 0) {
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: Warning: MySQL is trying to drop table %s\n"
"InnoDB: though there are still open handles to it.\n"
"InnoDB: Adding the table to the background drop queue.\n",
table->name);
row_add_table_to_background_drop_list(table); row_add_table_to_background_drop_list(table);
err = DB_SUCCESS; err = DB_SUCCESS;
......
...@@ -981,7 +981,10 @@ ha_innobase::open( ...@@ -981,7 +981,10 @@ ha_innobase::open(
/* Get pointer to a table object in InnoDB dictionary cache */ /* Get pointer to a table object in InnoDB dictionary cache */
if (NULL == (ib_table = dict_table_get(norm_name, NULL))) { ib_table = dict_table_get_and_increment_handle_count(
norm_name, NULL);
if (NULL == ib_table) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: cannot find table %s from the internal data dictionary\n" "InnoDB: Error: cannot find table %s from the internal data dictionary\n"
......
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