From 7ecb304996df7d917ef1e857090a9a9c525160f1 Mon Sep 17 00:00:00 2001 From: Sergey Vojtovich Date: Fri, 10 Jun 2016 17:37:12 +0400 Subject: Code cleanups - unused TABLE_SHARE::deleting and TABLE_LIST::deleting flags were removed - kill_delayed_threads_for_table() and intern_close_table() are now private methods of table cache - removed free_share flag of closefrm(): it was never used for temporary tables and was rarely useful for regular tables --- sql/handler.cc | 2 +- sql/sql_admin.cc | 5 ++- sql/sql_base.cc | 70 +++-------------------------------------- sql/sql_base.h | 2 -- sql/sql_table.cc | 2 +- sql/table.cc | 14 +-------- sql/table.h | 5 +-- sql/table_cache.cc | 62 ++++++++++++++++++++++++++++++++++-- storage/oqgraph/ha_oqgraph.cc | 18 +++++------ storage/spider/spd_sys_table.cc | 3 +- 10 files changed, 83 insertions(+), 100 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 2186d389056..f8683c54242 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -4694,7 +4694,7 @@ int ha_create_table(THD *thd, const char *path, share.table_name.str, share.table_name.length); } - (void) closefrm(&table, 0); + (void) closefrm(&table); err: free_table_share(&share); diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 205621c6f9f..5c400e44bc7 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -261,7 +261,10 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list, end: thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0); if (table == &tmp_table) - closefrm(table, 1); // Free allocated memory + { + closefrm(table); + tdc_release_share(table->s); + } /* In case of a temporary table there will be no metadata lock. */ if (error && has_mdl_lock) thd->mdl_context.release_transactional_locks(); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index c5510d95b64..e6f8b291778 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -336,68 +336,6 @@ OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild) DBUG_RETURN(argument.open_list); } -/***************************************************************************** - * Functions to free open table cache - ****************************************************************************/ - - -void intern_close_table(TABLE *table) -{ // Free all structures - DBUG_ENTER("intern_close_table"); - DBUG_PRINT("tcache", ("table: '%s'.'%s' 0x%lx", - table->s ? table->s->db.str : "?", - table->s ? table->s->table_name.str : "?", - (long) table)); - - delete table->triggers; - if (table->file) // Not true if placeholder - (void) closefrm(table, 1); // close file - table->alias.free(); - my_free(table); - DBUG_VOID_RETURN; -} - - -/** - Auxiliary function which allows to kill delayed threads for - particular table identified by its share. - - @param share Table share. - - @pre Caller should have TABLE_SHARE::tdc.LOCK_table_share mutex. -*/ - -void kill_delayed_threads_for_table(TDC_element *element) -{ - TDC_element::All_share_tables_list::Iterator it(element->all_tables); - TABLE *tab; - - mysql_mutex_assert_owner(&element->LOCK_table_share); - - if (!delayed_insert_threads) - return; - - while ((tab= it++)) - { - THD *in_use= tab->in_use; - - DBUG_ASSERT(in_use && tab->s->tdc->flushed); - if ((in_use->system_thread & SYSTEM_THREAD_DELAYED_INSERT) && - ! in_use->killed) - { - in_use->killed= KILL_SYSTEM_THREAD; - mysql_mutex_lock(&in_use->mysys_var->mutex); - if (in_use->mysys_var->current_cond) - { - mysql_mutex_lock(in_use->mysys_var->current_mutex); - mysql_cond_broadcast(in_use->mysys_var->current_cond); - mysql_mutex_unlock(in_use->mysys_var->current_mutex); - } - mysql_mutex_unlock(&in_use->mysys_var->mutex); - } - } -} - /* Close all tables which aren't in use by any thread @@ -1779,7 +1717,7 @@ void close_temporary(TABLE *table, bool free_share, bool delete_table) DBUG_PRINT("tmptable", ("closing table: '%s'.'%s'", table->s->db.str, table->s->table_name.str)); - closefrm(table, 0); + closefrm(table); if (delete_table) rm_temporary_table(table_type, table->s->path.str); if (free_share) @@ -2545,7 +2483,7 @@ retry_share: } if (open_table_entry_fini(thd, share, table)) { - closefrm(table, 0); + closefrm(table); my_free(table); goto err_lock; } @@ -3361,12 +3299,12 @@ static bool auto_repair_table(THD *thd, TABLE_LIST *table_list) sql_print_error("Couldn't repair table: %s.%s", share->db.str, share->table_name.str); if (entry->file) - closefrm(entry, 0); + closefrm(entry); } else { thd->clear_error(); // Clear error message - closefrm(entry, 0); + closefrm(entry); result= FALSE; } diff --git a/sql/sql_base.h b/sql/sql_base.h index d6bd0e2ace7..040e2897582 100644 --- a/sql/sql_base.h +++ b/sql/sql_base.h @@ -271,8 +271,6 @@ bool open_normal_and_derived_tables(THD *thd, TABLE_LIST *tables, uint flags, uint dt_phases); bool lock_tables(THD *thd, TABLE_LIST *tables, uint counter, uint flags); int decide_logging_format(THD *thd, TABLE_LIST *tables); -void intern_close_table(TABLE *entry); -void kill_delayed_threads_for_table(TDC_element *element); void close_thread_table(THD *thd, TABLE **table_ptr); bool close_temporary_tables(THD *thd); TABLE_LIST *unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 91e0369d7a3..296953b3375 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4889,7 +4889,7 @@ int create_table_impl(THD *thd, open_table_from_share(thd, &share, "", 0, (uint) READ_ALL, 0, &table, true)); if (!result) - (void) closefrm(&table, 0); + (void) closefrm(&table); free_table_share(&share); diff --git a/sql/table.cc b/sql/table.cc index 44d4b49d0dc..55bc918b3c2 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3020,21 +3020,16 @@ partititon_err: SYNOPSIS closefrm() table TABLE object to free - free_share Is 1 if we also want to free table_share */ -int closefrm(register TABLE *table, bool free_share) +int closefrm(register TABLE *table) { int error=0; DBUG_ENTER("closefrm"); DBUG_PRINT("enter", ("table: 0x%lx", (long) table)); if (table->db_stat) - { - if (table->s->deleting) - table->file->extra(HA_EXTRA_PREPARE_FOR_DROP); error=table->file->ha_close(); - } table->alias.free(); if (table->expr_arena) table->expr_arena->free_items(); @@ -3057,13 +3052,6 @@ int closefrm(register TABLE *table, bool free_share) table->part_info= 0; } #endif - if (free_share) - { - if (table->s->tmp_table == NO_TMP_TABLE) - tdc_release_share(table->s); - else - free_table_share(table->s); - } free_root(&table->mem_root, MYF(0)); DBUG_RETURN(error); } diff --git a/sql/table.h b/sql/table.h index ef1fd3dccc1..81869f6754d 100644 --- a/sql/table.h +++ b/sql/table.h @@ -673,7 +673,6 @@ struct TABLE_SHARE bool crypted; /* If .frm file is crypted */ bool crashed; bool is_view; - bool deleting; /* going to delete this table */ bool can_cmp_whole_record; bool table_creation_was_logged; ulong table_map_id; /* for row-based replication */ @@ -2019,8 +2018,6 @@ struct TABLE_LIST */ bool is_fqtn; - bool deleting; /* going to delete this table */ - /* TRUE <=> derived table should be filled right after optimization. */ bool fill_me; /* TRUE <=> view/DT is merged. */ @@ -2621,7 +2618,7 @@ bool get_field(MEM_ROOT *mem, Field *field, class String *res); bool validate_comment_length(THD *thd, LEX_STRING *comment, size_t max_len, uint err_code, const char *name); -int closefrm(TABLE *table, bool free_share); +int closefrm(TABLE *table); void free_blobs(TABLE *table); void free_field_buffers_larger_than(TABLE *table, uint32 size); ulong get_form_pos(File file, uchar *head, TYPELIB *save_names); diff --git a/sql/table_cache.cc b/sql/table_cache.cc index acfd3bd63ab..bd50f5b4b3a 100644 --- a/sql/table_cache.cc +++ b/sql/table_cache.cc @@ -36,8 +36,6 @@ - get number of TABLE objects in cache (tc_records()) Dependencies: - - intern_close_table(): frees TABLE object - - kill_delayed_threads_for_table() - close_cached_tables(): flush tables on shutdown - alloc_table_share() - free_table_share() @@ -127,6 +125,25 @@ static int fix_thd_pins(THD *thd) part of table definition cache. */ +static void intern_close_table(TABLE *table) +{ + DBUG_ENTER("intern_close_table"); + DBUG_PRINT("tcache", ("table: '%s'.'%s' 0x%lx", + table->s ? table->s->db.str : "?", + table->s ? table->s->table_name.str : "?", + (long) table)); + + delete table->triggers; + if (table->file) // Not true if placeholder + { + (void) closefrm(table); + tdc_release_share(table->s); + } + table->alias.free(); + my_free(table); + DBUG_VOID_RETURN; +} + /** Get number of TABLE objects (used and unused) in table cache. @@ -938,6 +955,47 @@ void tdc_release_share(TABLE_SHARE *share) } +/** + Auxiliary function which allows to kill delayed threads for + particular table identified by its share. + + @param share Table share. + + @pre Caller should have TABLE_SHARE::tdc.LOCK_table_share mutex. +*/ + +static void kill_delayed_threads_for_table(TDC_element *element) +{ + TDC_element::All_share_tables_list::Iterator it(element->all_tables); + TABLE *tab; + + mysql_mutex_assert_owner(&element->LOCK_table_share); + + if (!delayed_insert_threads) + return; + + while ((tab= it++)) + { + THD *in_use= tab->in_use; + + DBUG_ASSERT(in_use && tab->s->tdc->flushed); + if ((in_use->system_thread & SYSTEM_THREAD_DELAYED_INSERT) && + ! in_use->killed) + { + in_use->killed= KILL_SYSTEM_THREAD; + mysql_mutex_lock(&in_use->mysys_var->mutex); + if (in_use->mysys_var->current_cond) + { + mysql_mutex_lock(in_use->mysys_var->current_mutex); + mysql_cond_broadcast(in_use->mysys_var->current_cond); + mysql_mutex_unlock(in_use->mysys_var->current_mutex); + } + mysql_mutex_unlock(&in_use->mysys_var->mutex); + } + } +} + + /** Remove all or some (depending on parameter) instances of TABLE and TABLE_SHARE from the table definition cache. diff --git a/storage/oqgraph/ha_oqgraph.cc b/storage/oqgraph/ha_oqgraph.cc index 78a0079a5ab..9247d778e98 100644 --- a/storage/oqgraph/ha_oqgraph.cc +++ b/storage/oqgraph/ha_oqgraph.cc @@ -663,7 +663,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) { fprint_error("Column '%s.%s' (origid) is not a not-null integer type", options->table_name, options->origid); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -673,7 +673,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) if (!origid) { fprint_error("Invalid OQGRAPH backing store ('%s.origid' attribute not set to a valid column of '%s')", p+1, options->table_name); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -688,7 +688,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) { fprint_error("Column '%s.%s' (destid) is not a not-null integer type or is a different type to origid attribute.", options->table_name, options->destid); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -698,7 +698,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) if (!destid) { fprint_error("Invalid OQGRAPH backing store ('%s.destid' attribute not set to a valid column of '%s')", p+1, options->table_name); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -706,7 +706,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) // Make sure origid column != destid column if (strcmp( origid->field_name, destid->field_name)==0) { fprint_error("Invalid OQGRAPH backing store ('%s.destid' attribute set to same column as origid attribute)", p+1, options->table_name); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -720,7 +720,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) { fprint_error("Column '%s.%s' (weight) is not a not-null real type", options->table_name, options->weight); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -730,7 +730,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) if (!weight && options->weight) { fprint_error("Invalid OQGRAPH backing store ('%s.weight' attribute not set to a valid column of '%s')", p+1, options->table_name); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -738,7 +738,7 @@ int ha_oqgraph::open(const char *name, int mode, uint test_if_locked) if (!(graph_share = oqgraph::create(edges, origid, destid, weight))) { fprint_error("Unable to create graph instance."); - closefrm(edges, 0); + closefrm(edges); free_table_share(share); DBUG_RETURN(-1); } @@ -763,7 +763,7 @@ int ha_oqgraph::close(void) if (have_table_share) { if (edges->file) - closefrm(edges, 0); + closefrm(edges); free_table_share(share); have_table_share = false; } diff --git a/storage/spider/spd_sys_table.cc b/storage/spider/spd_sys_table.cc index f126fdddf64..86ab5fdccf4 100644 --- a/storage/spider/spd_sys_table.cc +++ b/storage/spider/spd_sys_table.cc @@ -227,7 +227,8 @@ void spider_close_sys_table( close_performance_schema_table(thd, open_tables_backup); } else { table->file->ha_reset(); - closefrm(table, TRUE); + closefrm(table); + tdc_release_share(table->s); spider_free(spider_current_trx, table, MYF(0)); thd->restore_backup_open_tables_state(open_tables_backup); } -- cgit v1.2.1