From 3f586da948ef3af2994fa1fc59474a2e8ad7befe Mon Sep 17 00:00:00 2001 From: "dlenev@dlenev.mshome" <> Date: Fri, 26 Sep 2003 17:42:05 +0400 Subject: [PATCH 1/4] Fixed spurios failures of rpl_until test. --- mysql-test/r/rpl_until.result | 10 +++++----- mysql-test/t/rpl_until.test | 7 +++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mysql-test/r/rpl_until.result b/mysql-test/r/rpl_until.result index a6b2908b0a5..3dc3de8802d 100644 --- a/mysql-test/r/rpl_until.result +++ b/mysql-test/r/rpl_until.result @@ -31,7 +31,7 @@ n 4 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Until_condition Until_Log_File Until_Log_pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key -127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 288 master-bin.000001 Yes No 0 0 244 605 Master master-bin.000001 244 No +127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 332 master-bin.000001 Yes No 0 0 244 649 Master master-bin.000001 244 No start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291; select * from t1; n @@ -41,21 +41,21 @@ n 4 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Until_condition Until_Log_File Until_Log_pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key -127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 288 master-bin.000001 Yes No 0 0 244 605 Master master-no-such-bin.000001 291 No -start slave until relay_log_file='slave-relay-bin.000002', relay_log_pos=493; +127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 332 master-bin.000001 Yes No 0 0 244 649 Master master-no-such-bin.000001 291 No +start slave until relay_log_file='slave-relay-bin.000002', relay_log_pos=537; select * from t2; n 1 2 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Until_condition Until_Log_File Until_Log_pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key -127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 493 master-bin.000001 Yes No 0 0 449 605 Relay slave-relay-bin.000002 493 No +127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 537 master-bin.000001 Yes No 0 0 449 649 Relay slave-relay-bin.000002 537 No start slave; stop slave; start slave until master_log_file='master-bin.000001', master_log_pos=561; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Replicate_do_table Replicate_ignore_table Replicate_wild_do_table Replicate_wild_ignore_table Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Until_condition Until_Log_File Until_Log_pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key -127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 605 master-bin.000001 Yes No 0 0 561 649 Master master-bin.000001 561 No +127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 561 slave-relay-bin.000002 649 master-bin.000001 Yes No 0 0 561 693 Master master-bin.000001 561 No start slave until master_log_file='master-bin', master_log_pos=561; ERROR HY000: Wrong parameter or combination of parameters for START SLAVE UNTIL start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12; diff --git a/mysql-test/t/rpl_until.test b/mysql-test/t/rpl_until.test index 0c9ff03b5bd..69101f8fa2c 100644 --- a/mysql-test/t/rpl_until.test +++ b/mysql-test/t/rpl_until.test @@ -3,8 +3,11 @@ source include/master-slave.inc; # prepare version for substitutions let $VERSION=`select version()`; -# stop slave before he will start replication +# stop slave before he will start replication also sync with master +# for avoiding undetermenistic behaviour +save_master_pos; connection slave; +sync_with_master; stop slave; connection master; @@ -37,7 +40,7 @@ sleep 2; show slave status; # try replicate all until second insert to t2; -start slave until relay_log_file='slave-relay-bin.000002', relay_log_pos=493; +start slave until relay_log_file='slave-relay-bin.000002', relay_log_pos=537; sleep 2; select * from t2; --replace_result $MASTER_MYPORT MASTER_MYPORT From 30c55ea4642a13e6a351372f14fdf3a7b2606d27 Mon Sep 17 00:00:00 2001 From: "guilhem@gbichot2" <> Date: Fri, 26 Sep 2003 22:56:13 +0200 Subject: [PATCH 2/4] A fix of the fix for BUG#1209 (was: SELECT DATABASE() still shows dropped database). Don't free the client's selected db (thd->db) when it has been DROPped, if this is a slave thread; the x_free() was causing a lot of various bugs in rpl_loaddata_rule_m (garbage characters, segfault, hangs in other threads). A small post-merge fix (rli->inside_transaction exists in 4.0 only). --- sql/log_event.cc | 11 +++++++---- sql/sql_db.cc | 26 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/sql/log_event.cc b/sql/log_event.cc index eee5be4c40f..b6964c40422 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1876,19 +1876,22 @@ int Rotate_log_event::exec_event(struct st_relay_log_info* rli) pthread_mutex_lock(&rli->data_lock); -#ifdef TO_BE_CHECKED_BY_GUILHEM - if (rli->inside_transaction) + if (thd->options & OPTION_BEGIN) { slave_print_error(rli, 0, + opt_using_transactions ? "\ There is an unfinished transaction in the relay log (could find neither \ COMMIT nor ROLLBACK in the relay log); It could be that the master died while \ writing the transaction to its binary log. Now the slave is rolling back the \ -transaction."); +transaction." : + "\ +There is an unfinished transaction in the relay log (could find neither \ +COMMIT nor ROLLBACK in the relay log); It could be that the master died while \ +writing the transaction to its binary log."); pthread_mutex_unlock(&rli->data_lock); DBUG_RETURN(1); } -#endif memcpy(log_name, new_log_ident, ident_len+1); rli->notify_group_master_log_name_update(); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 2b42c2c9a5b..2ba7f73ba80 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -391,10 +391,32 @@ int mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent) exit: start_waiting_global_read_lock(thd); + /* + If this database was the client's selected database, we silently change the + client's selected database to nothing (to have an empty SELECT DATABASE() in + the future). For this we free() thd->db and set it to 0. But we don't do + free() for the slave thread. Indeed, doing a x_free() on it leads to nasty + problems (i.e. long painful debugging) because in this thread, thd->db is + the same as data_buf and db of the Query_log_event which is dropping the + database. So if you free() thd->db, you're freeing data_buf. You set thd->db + to 0 but not data_buf (thd->db and data_buf are two distinct pointers which + point to the same place). Then in ~Query_log_event(), we have + 'if (data_buf) free(data_buf)' + data_buf is !=0 so this makes a DOUBLE free(). + Side effects of this double free() are, randomly (depends on the machine), + when the slave is replicating a DROP DATABASE: + - garbage characters in the error message: + "Error 'Can't drop database 'test2'; database doesn't exist' on query + 'h4zIż'" + - segfault + - hang in "free(vio)" (yes!) in the I/O or SQL slave threads (so slave + server hangs at shutdown etc). + */ if (thd->db && !strcmp(thd->db, db)) { - x_free(thd->db); - thd->db= 0; + if (!(thd->slave_thread)) /* a slave thread will free it itself */ + x_free(thd->db); + thd->db= 0; } exit2: VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); From 492ecc54f00f73396f3a25bdb5772b87c26cc17a Mon Sep 17 00:00:00 2001 From: "lenz@kallisto.local" <> Date: Fri, 26 Sep 2003 23:57:06 +0200 Subject: [PATCH 3/4] - added missing zlib subdirectory to the source distribution (crc32.c is included by mysys/my_crc32.c) --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index ffebf891795..56e5b78ea90 100644 --- a/Makefile.am +++ b/Makefile.am @@ -20,7 +20,7 @@ AUTOMAKE_OPTIONS = foreign # These are built from source in the Docs directory EXTRA_DIST = INSTALL-SOURCE README \ - COPYING COPYING.LIB + COPYING COPYING.LIB zlib SUBDIRS = . include @docs_dirs@ \ @readline_topdir@ sql-common \ @thread_dirs@ pstack @sql_client_dirs@ \ From f9501393214fe34c8fd5c2ebff22f41c13e93cd8 Mon Sep 17 00:00:00 2001 From: "lenz@kallisto.local" <> Date: Sat, 27 Sep 2003 00:25:57 +0200 Subject: [PATCH 4/4] - better test for a string to avoid "test: integer expression expected" if a variable is not defined (empty). --- scripts/mysql_install_db.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index 09a720f273d..65731c2bcb7 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -128,7 +128,7 @@ fi if test ! -x $mysqld then - if test "$in_rpm" -eq 1 + if test "$in_rpm" = 1 then echo "FATAL ERROR $mysqld not found!" exit 1 @@ -167,7 +167,7 @@ then fi fi -if test "$ip_only" -eq 1 +if test "$ip_only" = 1 then ip=`echo "$resolved" | awk '/ /{print $6}'` hostname=$ip @@ -187,7 +187,7 @@ then c_d="yes" fi -if test $verbose -eq 1 +if test $verbose = 1 then create_option="verbose" else