List:Commits« Previous MessageNext Message »
From:kgeorge Date:July 23 2007 12:10pm
Subject:bk commit into 5.0 tree (gkodinov:1.2475) BUG#29749
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of kgeorge. When kgeorge 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-23 13:10:33+03:00, gkodinov@stripped +3 -0
  Bug #29749: Failed DROP USER still binlogged and replicated
  
  CREATE/RENAME/DROP USER can handle more than one user in
  a single command, e.g. DROP USER u1, u2;
  There's no need to log the operation to slave if all of
  the users cannot be processed (e.g. they don't exist).
  But the command must be logged if even one of the operations
  produces result.
  Fixed by not logging CREATE/RENAME/DROP USER if all of its 
  sub-operations fail to execute on master.
  Note that if any of the sub-operations succeeds all of the
  statement is sent to the replication log (and will still 
  cause disconnect on the SQL thread if any of the 
  sub-operations fail).

  mysql-test/r/rpl_grant.result@stripped, 2007-07-23 13:10:31+03:00, gkodinov@stripped +60 -2
    Bug #29749: test case + proper cleanup

  mysql-test/t/rpl_grant.test@stripped, 2007-07-23 13:10:31+03:00, gkodinov@stripped +38 -1
    Bug #29749: test case + proper cleanup

  sql/sql_acl.cc@stripped, 2007-07-23 13:10:31+03:00, gkodinov@stripped +12 -3
    Bug #29749: Don't log CREATE/RENAME/DROP USER
    if all of the operation fails

diff -Nrup a/mysql-test/r/rpl_grant.result b/mysql-test/r/rpl_grant.result
--- a/mysql-test/r/rpl_grant.result	2007-06-21 17:55:48 +03:00
+++ b/mysql-test/r/rpl_grant.result	2007-07-23 13:10:31 +03:00
@@ -48,7 +48,7 @@ Master_User	root
 Master_Port	MASTER_PORT
 Connect_Retry	1
 Master_Log_File	master-bin.000001
-Read_Master_Log_Pos	609
+Read_Master_Log_Pos	#
 Relay_Log_File	#
 Relay_Log_Pos	#
 Relay_Master_Log_File	master-bin.000001
@@ -63,7 +63,7 @@ Replicate_Wild_Ignore_Table	
 Last_Errno	0
 Last_Error	
 Skip_Counter	0
-Exec_Master_Log_Pos	609
+Exec_Master_Log_Pos	#
 Relay_Log_Space	#
 Until_Condition	None
 Until_Log_File	
@@ -75,3 +75,61 @@ Master_SSL_Cert	
 Master_SSL_Cipher	
 Master_SSL_Key	
 Seconds_Behind_Master	#
+reset master;
+create user u1;
+create user u1;
+ERROR HY000: Operation CREATE USER failed for 'u1'@'%'
+rename user 'notexists'@'localhost' to 'utopia'@'localhost';
+ERROR HY000: Operation RENAME USER failed for 'notexists'@'localhost'
+drop user 'notexists'@'localhost';
+ERROR HY000: Operation DROP USER failed for 'notexists'@'localhost'
+create user u1, u2;
+ERROR HY000: Operation CREATE USER failed for 'u1'@'%'
+rename user u2 to u3, 'notexists'@'localhost' to 'utopia'@'localhost';
+ERROR HY000: Operation RENAME USER failed for 'notexists'@'localhost'
+drop user u1, u3, 'notexists'@'localhost';
+ERROR HY000: Operation DROP USER failed for 'notexists'@'localhost'
+**** On Slave ****
+DROP USER u1;
+ERROR HY000: Operation DROP USER failed for 'u1'@'%'
+show slave status;
+Slave_IO_State	x
+Master_Host	x
+Master_User	x
+Master_Port	x
+Connect_Retry	x
+Master_Log_File	x
+Read_Master_Log_Pos	x
+Relay_Log_File	x
+Relay_Log_Pos	x
+Relay_Master_Log_File	x
+Slave_IO_Running	Yes
+Slave_SQL_Running	Yes
+Replicate_Do_DB	x
+Replicate_Ignore_DB	x
+Replicate_Do_Table	x
+Replicate_Ignore_Table	x
+Replicate_Wild_Do_Table	x
+Replicate_Wild_Ignore_Table	x
+Last_Errno	x
+Last_Error	x
+Skip_Counter	x
+Exec_Master_Log_Pos	x
+Relay_Log_Space	x
+Until_Condition	x
+Until_Log_File	x
+Until_Log_Pos	x
+Master_SSL_Allowed	x
+Master_SSL_CA_File	x
+Master_SSL_CA_Path	x
+Master_SSL_Cert	x
+Master_SSL_Cipher	x
+Master_SSL_Key	x
+Seconds_Behind_Master	x
+**** On Master ****
+show binlog events limit 1, 100;
+Log_name	Pos	Event_type	Server_id	End_log_pos	Info
+x	x	x	x	x	use `test`; create user u1
+x	x	x	x	x	use `test`; create user u1, u2
+x	x	x	x	x	use `test`; rename user u2 to u3, 'notexists'@'localhost' to
'utopia'@'localhost'
+x	x	x	x	x	use `test`; drop user u1, u3, 'notexists'@'localhost'
diff -Nrup a/mysql-test/t/rpl_grant.test b/mysql-test/t/rpl_grant.test
--- a/mysql-test/t/rpl_grant.test	2007-06-21 17:55:49 +03:00
+++ b/mysql-test/t/rpl_grant.test	2007-07-23 13:10:31 +03:00
@@ -38,5 +38,42 @@ SELECT user,host FROM mysql.user WHERE u
 SELECT COUNT(*) FROM mysql.user;
 
 --replace_result $MASTER_MYPORT MASTER_PORT
---replace_column 1 # 8 # 9 # 23 # 33 #
+--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 #
 query_vertical SHOW SLAVE STATUS;
+connection master;
+
+#
+# Bug #29749: Failed DROP USER still binlogged and replicated
+#
+
+reset master;
+create user u1;
+sync_slave_with_master;
+connection master;
+--error ER_CANNOT_USER
+create user u1;
+--error ER_CANNOT_USER
+rename user 'notexists'@'localhost' to 'utopia'@'localhost';
+--error ER_CANNOT_USER
+drop user 'notexists'@'localhost';
+--error ER_CANNOT_USER
+create user u1, u2;
+--error ER_CANNOT_USER
+rename user u2 to u3, 'notexists'@'localhost' to 'utopia'@'localhost';
+--error ER_CANNOT_USER
+drop user u1, u3, 'notexists'@'localhost';
+
+sync_slave_with_master;
+--echo **** On Slave ****
+--error ER_CANNOT_USER
+DROP USER u1;
+
+--vertical_results
+--replace_column 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 13 x 14 x 15 x 16 x 17 x 18 x
19 x 20 x 21 x 22 x 23 x 24 x 25 x 26 x 27 x 28 x 29 x 30 x 31 x 32 x 33 x
+show slave status;
+--horizontal_results
+
+connection master;
+--echo **** On Master ****
+--replace_column 1 x 2 x 3 x 4 x 5 x
+show binlog events limit 1, 100;
diff -Nrup a/sql/sql_acl.cc b/sql/sql_acl.cc
--- a/sql/sql_acl.cc	2007-06-20 15:24:27 +03:00
+++ b/sql/sql_acl.cc	2007-07-23 13:10:31 +03:00
@@ -5273,6 +5273,7 @@ bool mysql_create_user(THD *thd, List <L
 {
   int result;
   String wrong_users;
+  my_bool all_users_fail= TRUE;
   ulong sql_mode;
   LEX_USER *user_name, *tmp_user_name;
   List_iterator <LEX_USER> user_list(list);
@@ -5310,12 +5311,14 @@ bool mysql_create_user(THD *thd, List <L
     {
       append_user(&wrong_users, user_name);
       result= TRUE;
+      continue;
     }
+    all_users_fail= FALSE;
   }
 
   VOID(pthread_mutex_unlock(&acl_cache->lock));
 
-  if (mysql_bin_log.is_open())
+  if (mysql_bin_log.is_open() && !all_users_fail)
   {
     Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
     mysql_bin_log.write(&qinfo);
@@ -5345,6 +5348,7 @@ bool mysql_create_user(THD *thd, List <L
 bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
 {
   int result;
+  my_bool all_users_fail= TRUE;
   String wrong_users;
   LEX_USER *user_name, *tmp_user_name;
   List_iterator <LEX_USER> user_list(list);
@@ -5370,7 +5374,9 @@ bool mysql_drop_user(THD *thd, List <LEX
     {
       append_user(&wrong_users, user_name);
       result= TRUE;
+      continue;
     }
+    all_users_fail= FALSE;
   }
 
   /* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
@@ -5384,7 +5390,7 @@ bool mysql_drop_user(THD *thd, List <LEX
   DBUG_PRINT("info", ("thd->net.last_errno: %d", thd->net.last_errno));
   DBUG_PRINT("info", ("thd->net.last_error: %s", thd->net.last_error));
 
-  if (mysql_bin_log.is_open())
+  if (mysql_bin_log.is_open() && !all_users_fail)
   {
     Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
     mysql_bin_log.write(&qinfo);
@@ -5413,6 +5419,7 @@ bool mysql_rename_user(THD *thd, List <L
 {
   int result;
   String wrong_users;
+  my_bool all_users_fail= TRUE;
   LEX_USER *user_from, *tmp_user_from;
   LEX_USER *user_to, *tmp_user_to;
   List_iterator <LEX_USER> user_list(list);
@@ -5450,7 +5457,9 @@ bool mysql_rename_user(THD *thd, List <L
     {
       append_user(&wrong_users, user_from);
       result= TRUE;
+      continue;
     }
+    all_users_fail= FALSE;
   }
   
   /* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
@@ -5458,7 +5467,7 @@ bool mysql_rename_user(THD *thd, List <L
 
   VOID(pthread_mutex_unlock(&acl_cache->lock));
 
-  if (mysql_bin_log.is_open())
+  if (mysql_bin_log.is_open() && !all_users_fail)
   {
     Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
     mysql_bin_log.write(&qinfo);
Thread
bk commit into 5.0 tree (gkodinov:1.2475) BUG#29749kgeorge23 Jul