From c01aeb1083574d789eeb366776a8d6f60bb8cc21 Mon Sep 17 00:00:00 2001 From: Kristofer Pettersson Date: Wed, 10 Sep 2008 16:58:03 +0200 Subject: [PATCH] Bug#38692 concurrent inserts cause valgrind errors in Query_cache::invalidate If a delayed insert thread was aborted by a concurrent 'truncate table' statement, then the diagnostic area would fail with an assert in a debug build because no actual error message was pushed on the stack despite a thread being killed. This patch adds an error message to the stack. --- sql/sql_insert.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 9e3c591ae2a..8a7a5ca90a5 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2532,8 +2532,13 @@ bool Delayed_insert::handle_inserts(void) thd_proc_info(&thd, "upgrading lock"); if (thr_upgrade_write_delay_lock(*thd.lock->locks)) { - /* This can only happen if thread is killed by shutdown */ - sql_print_error(ER(ER_DELAYED_CANT_CHANGE_LOCK),table->s->table_name.str); + /* + This can happen if thread is killed either by a shutdown + or if another thread is removing the current table definition + from the table cache. + */ + my_error(ER_DELAYED_CANT_CHANGE_LOCK,MYF(ME_FATALERROR), + table->s->table_name.str); goto err; } @@ -2688,9 +2693,10 @@ bool Delayed_insert::handle_inserts(void) query_cache_invalidate3(&thd, table, 1); if (thr_reschedule_write_lock(*thd.lock->locks)) { - /* This should never happen */ - sql_print_error(ER(ER_DELAYED_CANT_CHANGE_LOCK), - table->s->table_name.str); + /* This is not known to happen. */ + my_error(ER_DELAYED_CANT_CHANGE_LOCK,MYF(ME_FATALERROR), + table->s->table_name.str); + goto err; } if (!using_bin_log) table->file->extra(HA_EXTRA_WRITE_CACHE);