diff options
author | monty@hundin.mysql.fi <> | 2002-02-14 18:58:24 +0200 |
---|---|---|
committer | monty@hundin.mysql.fi <> | 2002-02-14 18:58:24 +0200 |
commit | e070e9a01f7a86c03e310ec92d9d0bfdc616674e (patch) | |
tree | 9f6476af645cdeb53eefe6ca4f6bc6f4ac04bf84 /innobase/row/row0mysql.c | |
parent | 15e9ca785a0272b912d5bbe258d5b6984b136d7b (diff) | |
parent | e45cff23b9331d1b3ea658c4f16b23cf4d3923c5 (diff) | |
download | mariadb-git-e070e9a01f7a86c03e310ec92d9d0bfdc616674e.tar.gz |
merge with 3.23.49
Diffstat (limited to 'innobase/row/row0mysql.c')
-rw-r--r-- | innobase/row/row0mysql.c | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 292f8c0c6c8..f5ed0ef65af 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -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)); @@ -1468,6 +1466,13 @@ loop: 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); @@ -1477,10 +1482,16 @@ loop: 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); @@ -1746,6 +1757,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; @@ -1807,6 +1825,7 @@ row_drop_database_for_mysql( char* name, /* in: database name which ends to '/' */ trx_t* trx) /* in: transaction handle */ { + dict_table_t* table; char* table_name; int err = DB_SUCCESS; @@ -1817,12 +1836,35 @@ row_drop_database_for_mysql( trx->op_info = (char *) "dropping database"; trx_start_if_not_started(trx); - +loop: mutex_enter(&(dict_sys->mutex)); while ((table_name = dict_get_first_table_name_in_db(name))) { ut_a(memcmp(table_name, name, strlen(name)) == 0); + table = dict_table_get_low(table_name); + + ut_a(table); + + /* Wait until MySQL does not have any queries running on + the table */ + + if (table->n_mysql_handles_opened > 0) { + mutex_exit(&(dict_sys->mutex)); + + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Warning: MySQL is trying to drop database %s\n" + "InnoDB: though there are still open handles to table %s.\n", + name, table_name); + + os_thread_sleep(1000000); + + mem_free(table_name); + + goto loop; + } + err = row_drop_table_for_mysql(table_name, trx, TRUE); mem_free(table_name); |