Below is the list of changes that have just been committed into a local
5.0 repository of svoj. When svoj does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-07-14 17:58:39+05:00, svoj@stripped +1 -0
BUG#29734 - thread_id=0 in binary log which leads to temporary table conflicts
pseudo_thread_id was reset to zero via mysql_change_user() handling
whereas there is no reason to do that. Moreover, having two
concurrent threads that change user and create a namesake temp tables
leads to recording the dup pair of queries:
set @@session.pseudo_thread_id = 0;
CREATE temporary table `the namesake`;
which will stall the slave as the second instance can not be created.
And that is the bug case.
Fixed by correcting pseudo_thread_id value after mysql_change_user().
sql/sql_class.cc@stripped, 2007-07-14 17:58:37+05:00, svoj@stripped +10 -1
Fixed that pseudo_thread_id was set to 0 after mysql_change_user().
diff -Nrup a/sql/sql_class.cc b/sql/sql_class.cc
--- a/sql/sql_class.cc 2007-07-06 03:43:02 +05:00
+++ b/sql/sql_class.cc 2007-07-14 17:58:37 +05:00
@@ -211,7 +211,7 @@ THD::THD()
time_after_lock=(time_t) 0;
current_linfo = 0;
slave_thread = 0;
- variables.pseudo_thread_id= 0;
+ thread_id= 0;
one_shot_set= 0;
file_id = 0;
query_id= 0;
@@ -328,6 +328,12 @@ void THD::init(void)
variables.date_format);
variables.datetime_format= date_time_format_copy((THD*) 0,
variables.datetime_format);
+ /*
+ variables= global_system_variables above has reset
+ variables.pseudo_thread_id to 0. We need to correct it here to
+ avoid temporary tables replication failure.
+ */
+ variables.pseudo_thread_id= thread_id;
pthread_mutex_unlock(&LOCK_global_system_variables);
server_status= SERVER_STATUS_AUTOCOMMIT;
if (variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES)
@@ -578,6 +584,9 @@ bool THD::store_globals()
/*
By default 'slave_proxy_id' is 'thread_id'. They may later become different
if this is the slave SQL thread.
+ */
+ /** @todo we already do it in init(), see if we still need to do it here.
+ add DBUG_ASSERT(variables.pseudo_thread_id == thread_id)
*/
variables.pseudo_thread_id= thread_id;
/*
| Thread |
|---|
| • bk commit into 5.0 tree (svoj:1.2526) BUG#29734 | Sergey Vojtovich | 14 Jul |