From b89d2fce588faea8693f79389d3785336de5797c Mon Sep 17 00:00:00 2001 From: "Tatiana A. Nurnberg" Date: Fri, 5 Jun 2009 00:23:08 +0200 Subject: [PATCH] Bug#32149: Long semaphore wait for adaptive hash latch Holding on to the temporary inno hash index latch is an optimization in many cases, but a pessimization in some others. Release temporary latches for those corner cases we (or rather, or customers, thanks!) have identified, that is, when we are about to do something that might take a really long time, like REPAIR or filesort. --- sql/ha_myisam.cc | 3 +++ sql/sql_insert.cc | 3 +++ sql/sql_select.cc | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 95b7b338131..086b1209a7a 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -1009,6 +1009,9 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool do_optimize) param.out_flag= 0; strmov(fixed_name,file->filename); + // Release latches since this can take a long time + ha_release_temporary_latches(thd); + // Don't lock tables if we have used LOCK TABLE if (!thd->locked_tables && mi_lock_database(file, table->s->tmp_table ? F_EXTRA_LCK : F_WRLCK)) diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index d9027e3f5b9..6d63a0907df 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2935,6 +2935,9 @@ bool select_insert::send_data(List &values) } } + // Release latches in case bulk insert takes a long time + ha_release_temporary_latches(thd); + error= write_record(thd, table, &info); table->auto_increment_field_not_null= FALSE; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 587c0b85ce6..437aca866c6 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -10226,6 +10226,9 @@ free_tmp_table(THD *thd, TABLE *entry) save_proc_info=thd->proc_info; thd_proc_info(thd, "removing tmp table"); + // Release latches since this can take a long time + ha_release_temporary_latches(thd); + if (entry->file) { if (entry->db_stat) @@ -10274,6 +10277,10 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, table->file->print_error(error,MYF(0)); DBUG_RETURN(1); } + + // Release latches since this can take a long time + ha_release_temporary_latches(thd); + new_table= *table; new_table.s= &new_table.share_not_to_be_used; new_table.s->db_type= DB_TYPE_MYISAM;