From 6ef4dc29c3cbd131c42b852c2526312a61729be0 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Tue, 9 Sep 2003 19:23:01 +0200 Subject: [PATCH 1/3] fixed: thread lock-up on a FLASH TABLE when another thread has an open handler Bug#1204 --- sql/sql_handler.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index b0d8b18dd17..a19fcdc2d73 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -34,7 +34,7 @@ The second is to be freeed only on thread end. mysql_ha_open should then do { handler_items=concat(handler_items, free_list); free_list=0; } - But !!! do_cammand calls free_root at the end of every query and frees up + But !!! do_command calls free_root at the end of every query and frees up all the sql_alloc'ed memory. It's harder to work around... */ @@ -73,7 +73,11 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables, bool dont_send_ok) if (*ptr) { VOID(pthread_mutex_lock(&LOCK_open)); - close_thread_table(thd, ptr); + if (close_thread_table(thd, ptr)) + { + /* Tell threads waiting for refresh that something has happened */ + VOID(pthread_cond_broadcast(&COND_refresh)); + } VOID(pthread_mutex_unlock(&LOCK_open)); } else @@ -90,8 +94,11 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables, bool dont_send_ok) int mysql_ha_closeall(THD *thd, TABLE_LIST *tables) { TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->real_name, 0); - if (*ptr) - close_thread_table(thd, ptr); + if (*ptr && close_thread_table(thd, ptr)) + { + /* Tell threads waiting for refresh that something has happened */ + VOID(pthread_cond_broadcast(&COND_refresh)); + } return 0; } From ebfa41086dc91a953c83ea993d3e4f69f9904d7d Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Thu, 11 Sep 2003 13:36:08 +0200 Subject: [PATCH 2/3] - backported compatibility fix for extra/resolveip.c from 4.0 to be able to compile on HP-UX 10.20 (which does not have in_add_t). --- extra/resolveip.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extra/resolveip.c b/extra/resolveip.c index 764844bf622..133f6ddeb07 100644 --- a/extra/resolveip.c +++ b/extra/resolveip.c @@ -36,6 +36,10 @@ extern int h_errno; #endif +#ifndef HAVE_IN_ADDR_T +#define in_addr_t u_long +#endif + static int silent=0; From 40a88045cb4e60028f9e548deeb89b1d412adf3c Mon Sep 17 00:00:00 2001 From: "guilhem@mysql.com" <> Date: Fri, 12 Sep 2003 17:26:48 +0200 Subject: [PATCH 3/3] Quick backport of the following bugfix from MySQL 4.0.14. DO NOT COPY THIS CODE TO 4.0. The bugfix is better in 4.0, but here in 3.23 we don't want to add a new error code so we just use ER_EMPTY_QUERY. Bug was: "If a query was ignored on the slave (because of @code{replicate-ignore-table} and other similar rules), the slave still checked if the query got the same error code (0, no error) as on the master. So if the master had an error on the query (for example, ``Duplicate entry'' in a multiple-row insert), then the slave stopped and warned that the error codes didn't match. (Bug #797)" --- sql/slave.cc | 3 ++- sql/sql_parse.cc | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sql/slave.cc b/sql/slave.cc index 50cb224d83d..a51db52cc7f 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -923,7 +923,8 @@ point. If you are sure that your master is ok, run this query manually on the\ inline int ignored_error_code(int err_code) { - return use_slave_mask && bitmap_is_set(&slave_error_mask, err_code); + return ((err_code == ER_EMPTY_QUERY) || + (use_slave_mask && bitmap_is_set(&slave_error_mask, err_code))); } static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 805063cb6dc..81233c038a1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1085,7 +1085,19 @@ mysql_execute_command(void) // rules have been given and the table list says the query should not be // replicated if(table_rules_on && tables && !tables_ok(thd,tables)) + { + /* + We consider the query as empty and warn the slave thread which will + consider ER_EMPTY_QUERY as an ignorable error. Note that this has a + drawback: if the event is corrupted it could contain an empty query; + then the slave thread will silently ignore it instead of warning. But + such corruption is unlikely enough. + In MySQL 4.0 we do it more properly using a new error code + (ER_SLAVE_IGNORED_TABLE). + */ + my_error(ER_EMPTY_QUERY, MYF(0)); DBUG_VOID_RETURN; + } // this is a workaround to deal with the shortcoming // in 3.23.44-3.23.46 masters // in RELEASE_LOCK() logging. We re-write SELECT RELEASE_LOCK() as