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 sql/ha_innobase.cc: Add some more safety if MySQL tries to drop a table on which there are open handles innobase/row/row0mysql.c: Add some more safety if MySQL tries to drop a table on which there are open handles innobase/dict/dict0dict.c: Add some more safety if MySQL tries to drop a table on which there are open handles innobase/include/dict0dict.h: Add some more safety if MySQL tries to drop a table on which there are open handles
This commit is contained in:
parent
5c08b0fbab
commit
199e17e577
@ -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(
|
|||||||
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
|
|||||||
#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(
|
|||||||
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(
|
|||||||
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:
|
|||||||
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:
|
|||||||
|
|
||||||
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(
|
|||||||
|
|
||||||
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(
|
|||||||
|
|
||||||
/* 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"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user