Commit 4197014b authored by Sergey Vojtovich's avatar Sergey Vojtovich

Yet less TDC hash lookups

Let auto repair table and truncate table routines flush TABLE_SHARE
directly.

Part of MDEV-17882 - Cleanup refresh version
parent 7a947614
...@@ -2942,9 +2942,7 @@ static bool auto_repair_table(THD *thd, TABLE_LIST *table_list) ...@@ -2942,9 +2942,7 @@ static bool auto_repair_table(THD *thd, TABLE_LIST *table_list)
result= FALSE; result= FALSE;
} }
tdc_release_share(share); tdc_remove_referenced_share(thd, share);
/* Remove the repaired share from the table cache. */
tdc_remove_table(thd, table_list->db.str, table_list->table_name.str);
end_free: end_free:
my_free(entry); my_free(entry);
return result; return result;
......
...@@ -336,6 +336,9 @@ bool Sql_cmd_truncate_table::lock_table(THD *thd, TABLE_LIST *table_ref, ...@@ -336,6 +336,9 @@ bool Sql_cmd_truncate_table::lock_table(THD *thd, TABLE_LIST *table_ref,
} }
#endif #endif
if (!versioned)
tdc_remove_referenced_share(thd, share);
else
tdc_release_share(share); tdc_release_share(share);
if (hton == view_pseudo_hton) if (hton == view_pseudo_hton)
...@@ -372,12 +375,6 @@ bool Sql_cmd_truncate_table::lock_table(THD *thd, TABLE_LIST *table_ref, ...@@ -372,12 +375,6 @@ bool Sql_cmd_truncate_table::lock_table(THD *thd, TABLE_LIST *table_ref,
if (*hton_can_recreate) if (*hton_can_recreate)
close_all_tables_for_name(thd, table->s, HA_EXTRA_NOT_USED, NULL); close_all_tables_for_name(thd, table->s, HA_EXTRA_NOT_USED, NULL);
} }
else
{
/* Table is already locked exclusively. Remove cached instances. */
tdc_remove_table(thd, table_ref->db.str, table_ref->table_name.str);
}
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
......
...@@ -996,6 +996,20 @@ void tdc_release_share(TABLE_SHARE *share) ...@@ -996,6 +996,20 @@ void tdc_release_share(TABLE_SHARE *share)
} }
void tdc_remove_referenced_share(THD *thd, TABLE_SHARE *share)
{
DBUG_ASSERT(thd->mdl_context.is_lock_owner(MDL_key::TABLE, share->db.str,
share->table_name.str,
MDL_EXCLUSIVE));
share->tdc->flush_unused(false);
mysql_mutex_lock(&share->tdc->LOCK_table_share);
share->tdc->wait_for_refs(1);
DBUG_ASSERT(share->tdc->all_tables.is_empty());
share->tdc->ref_count--;
tdc_delete_share_from_hash(share->tdc);
}
/** /**
Removes all TABLE instances and corresponding TABLE_SHARE Removes all TABLE instances and corresponding TABLE_SHARE
...@@ -1009,7 +1023,6 @@ void tdc_release_share(TABLE_SHARE *share) ...@@ -1009,7 +1023,6 @@ void tdc_release_share(TABLE_SHARE *share)
void tdc_remove_table(THD *thd, const char *db, const char *table_name) void tdc_remove_table(THD *thd, const char *db, const char *table_name)
{ {
Share_free_tables::List purge_tables;
TDC_element *element; TDC_element *element;
DBUG_ENTER("tdc_remove_table"); DBUG_ENTER("tdc_remove_table");
DBUG_PRINT("enter", ("name: %s", table_name)); DBUG_PRINT("enter", ("name: %s", table_name));
...@@ -1042,18 +1055,10 @@ void tdc_remove_table(THD *thd, const char *db, const char *table_name) ...@@ -1042,18 +1055,10 @@ void tdc_remove_table(THD *thd, const char *db, const char *table_name)
mysql_mutex_unlock(&LOCK_unused_shares); mysql_mutex_unlock(&LOCK_unused_shares);
element->ref_count++; element->ref_count++;
tc_remove_all_unused_tables(element, &purge_tables);
mysql_mutex_unlock(&element->LOCK_table_share); mysql_mutex_unlock(&element->LOCK_table_share);
while (auto table= purge_tables.pop_front()) /* We have to relock the mutex to avoid code duplication. Sigh. */
intern_close_table(table); tdc_remove_referenced_share(thd, element->share);
mysql_mutex_lock(&element->LOCK_table_share);
element->wait_for_refs(1);
DBUG_ASSERT(element->all_tables.is_empty());
element->ref_count--;
tdc_delete_share_from_hash(element);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -77,6 +77,7 @@ int tdc_share_is_cached(THD *thd, const char *db, const char *table_name); ...@@ -77,6 +77,7 @@ int tdc_share_is_cached(THD *thd, const char *db, const char *table_name);
extern TABLE_SHARE *tdc_acquire_share(THD *thd, TABLE_LIST *tl, uint flags, extern TABLE_SHARE *tdc_acquire_share(THD *thd, TABLE_LIST *tl, uint flags,
TABLE **out_table= 0); TABLE **out_table= 0);
extern void tdc_release_share(TABLE_SHARE *share); extern void tdc_release_share(TABLE_SHARE *share);
void tdc_remove_referenced_share(THD *thd, TABLE_SHARE *share);
void tdc_remove_table(THD *thd, const char *db, const char *table_name); void tdc_remove_table(THD *thd, const char *db, const char *table_name);
extern int tdc_wait_for_old_version(THD *thd, const char *db, extern int tdc_wait_for_old_version(THD *thd, const char *db,
......
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