diff options
author | monty@mashka.mysql.fi <> | 2003-01-19 02:28:07 +0200 |
---|---|---|
committer | monty@mashka.mysql.fi <> | 2003-01-19 02:28:07 +0200 |
commit | 12ab0651c60b04a1dc10a571b371f5ef863a8777 (patch) | |
tree | 950f9df8ccdc90bad3b9205701aba11ef93ac2dc /sql/slave.cc | |
parent | 0d284054246c9ba4dd122f6b3c777907111cf64d (diff) | |
parent | 183df2da7fc0f9f7f8bbf54fee055f3e470932a1 (diff) | |
download | mariadb-git-12ab0651c60b04a1dc10a571b371f5ef863a8777.tar.gz |
merge with 4.0 to get bug fix for SHOW PROCESSLIST + connected slave
Diffstat (limited to 'sql/slave.cc')
-rw-r--r-- | sql/slave.cc | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/sql/slave.cc b/sql/slave.cc index 271fe8bc2d6..97961eb00f8 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1011,6 +1011,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, const char* table_name) { ulong packet_len = my_net_read(net); // read create table statement + char *query; Vio* save_vio; HA_CHECK_OPT check_opt; TABLE_LIST tables; @@ -1030,15 +1031,23 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, return 1; } thd->command = COM_TABLE_DUMP; - thd->query = sql_alloc(packet_len + 1); - if (!thd->query) + /* Note that we should not set thd->query until the area is initalized */ + if (!(query = sql_alloc(packet_len + 1))) { sql_print_error("create_table_from_dump: out of memory"); net_printf(thd, ER_GET_ERRNO, "Out of memory"); return 1; } - memcpy(thd->query, net->read_pos, packet_len); - thd->query[packet_len] = 0; + memcpy(query, net->read_pos, packet_len); + query[packet_len]= 0; + thd->query_length= packet_len; + /* + We make the following lock in an attempt to ensure that the compiler will + not rearrange the code so that thd->query is set too soon + */ + VOID(pthread_mutex_lock(&LOCK_thread_count)); + thd->query= query; + VOID(pthread_mutex_unlock(&LOCK_thread_count)); thd->current_tablenr = 0; thd->query_error = 0; thd->net.no_send_ok = 1; @@ -2272,7 +2281,9 @@ err: // print the current replication position sql_print_error("Slave I/O thread exiting, read up to log '%s', position %s", IO_RPL_LOG_NAME, llstr(mi->master_log_pos,llbuff)); + VOID(pthread_mutex_lock(&LOCK_thread_count)); thd->query = thd->db = 0; // extra safety + VOID(pthread_mutex_unlock(&LOCK_thread_count)); if (mysql) { mc_mysql_close(mysql); @@ -2407,7 +2418,9 @@ the slave SQL thread with \"SLAVE START\". We stopped at log \ RPL_LOG_NAME, llstr(rli->master_log_pos,llbuff)); err: + VOID(pthread_mutex_lock(&LOCK_thread_count)); thd->query = thd->db = 0; // extra safety + VOID(pthread_mutex_unlock(&LOCK_thread_count)); thd->proc_info = "Waiting for slave mutex on exit"; pthread_mutex_lock(&rli->run_lock); DBUG_ASSERT(rli->slave_running == 1); // tracking buffer overrun |