Commit 57ef5c71 authored by heikki@hundin.mysql.fi's avatar heikki@hundin.mysql.fi
Browse files

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
Loading
Loading
Loading
Loading
+35 −15
Original line number Diff line number Diff line
@@ -195,21 +195,6 @@ dict_mutex_exit_for_mysql(void)
	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. */

@@ -495,6 +480,41 @@ dict_table_get(
	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. */

+10 −7
Original line number Diff line number Diff line
@@ -26,13 +26,6 @@ Created 1/8/1996 Heikki Tuuri
#include "ut0byte.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. */

@@ -195,6 +188,16 @@ dict_table_get(
	char*	table_name,	/* in: table name */
	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. */

dict_table_t*
+20 −2
Original line number Diff line number Diff line
@@ -273,8 +273,6 @@ row_create_prebuilt(
	ulint		ref_len;
	ulint		i;
	
	dict_table_increment_handle_count(table);

	heap = mem_heap_create(128);

	prebuilt = mem_heap_alloc(heap, sizeof(row_prebuilt_t));
@@ -1466,6 +1464,13 @@ row_drop_tables_for_mysql_in_background(void)
	table = dict_table_get_low(drop->table_name);
	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) {

		return(n_tables + n_tables_dropped);
@@ -1475,10 +1480,16 @@ row_drop_tables_for_mysql_in_background(void)
							
	row_drop_table_for_mysql_in_background(drop->table_name);

already_dropped:
	mutex_enter(&kernel_mutex);

	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);
@@ -1741,6 +1752,13 @@ row_drop_table_for_mysql(

	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);

		err = DB_SUCCESS;
+4 −1
Original line number Diff line number Diff line
@@ -981,7 +981,10 @@ ha_innobase::open(

	/* 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,
"InnoDB: Error: cannot find table %s from the internal data dictionary\n"