List:Commits« Previous MessageNext Message »
From:Chad MILLER Date:June 1 2006 11:27pm
Subject:bk commit into 5.0 tree (cmiller:1.2162) BUG#16206
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of cmiller. When cmiller 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
  1.2162 06/06/01 19:27:47 cmiller@zippy.(none) +5 -0
  Bug #16206: Superfluous COMMIT event in binlog when updating BDB in autocommit 
  	mode
  
  This is a modification of serg's and guilhem's suggestion in the bug report,
  in that it also causes the transaction log to be written to disc.

  sql/log_event.h
    1.124 06/06/01 19:27:42 cmiller@zippy.(none) +13 -0
    Add a new subclass of Query_log_event that doesn't write itself to the log, for
    cases where we only want to flush out the transaction and not also write about
    this event.

  sql/log_event.cc
    1.205 06/06/01 19:27:42 cmiller@zippy.(none) +17 -3
    Add a new subclass of Query_log_event that doesn't write itself to the log, for
    cases where we only want to flush out the transaction and not also write about
    this event.

  sql/log.cc
    1.189 06/06/01 19:27:42 cmiller@zippy.(none) +21 -6
    Create a log-committing event that itself won't be written to the log when 
    we're in autocommit mode.

  mysql-test/t/bdb.test
    1.52 06/06/01 19:27:42 cmiller@zippy.(none) +35 -0
    Add test

  mysql-test/r/bdb.result
    1.50 06/06/01 19:27:42 cmiller@zippy.(none) +34 -0
    Add result.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	cmiller
# Host:	zippy.(none)
# Root:	/home/cmiller/work/mysql/mysql-5.0__bug16206

--- 1.188/sql/log.cc	2006-03-31 04:47:59 -05:00
+++ 1.189/sql/log.cc	2006-06-01 19:27:42 -04:00
@@ -94,7 +94,9 @@
 {
   int error=0;
   DBUG_ENTER("binlog_end_trans");
-  if (end_ev)
+
+  /* NULL denotes ROLLBACK with nothing to replicate */
+  if (end_ev != NULL)
     error= mysql_bin_log.write(thd, trans_log, end_ev);
 
   statistic_increment(binlog_cache_use, &LOCK_status);
@@ -126,14 +128,23 @@
   DBUG_ASSERT(mysql_bin_log.is_open() &&
      (all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))));
 
-  if (!my_b_tell(trans_log))
+  if (my_b_tell(trans_log) == 0)
   {
     // we're here because trans_log was flushed in MYSQL_LOG::log()
     DBUG_RETURN(0);
   }
-  Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, FALSE);
-  qev.error_code= 0; // see comment in MYSQL_LOG::write(THD, IO_CACHE)
-  DBUG_RETURN(binlog_end_trans(thd, trans_log, &qev));
+
+  if (all)
+  {
+    Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, FALSE);
+    qev.error_code= 0; // see comment in MYSQL_LOG::write(THD, IO_CACHE)
+    DBUG_RETURN(binlog_end_trans(thd, trans_log, &qev));
+  }
+  else
+  {
+    Muted_query_log_event qev(thd, STRING_WITH_LEN("(silent commit)"), TRUE, FALSE);
+    DBUG_RETURN(binlog_end_trans(thd, trans_log, &qev));
+  }
 }
 
 static int binlog_rollback(THD *thd, bool all)
@@ -161,7 +172,7 @@
     error= binlog_end_trans(thd, trans_log, &qev);
   }
   else
-    error= binlog_end_trans(thd, trans_log, 0);
+    error= binlog_end_trans(thd, trans_log, NULL);
   DBUG_RETURN(error);
 }
 
@@ -1813,6 +1824,9 @@
   DBUG_ENTER("MYSQL_LOG::write(THD *, IO_CACHE *, Log_event *)");
   VOID(pthread_mutex_lock(&LOCK_log));
 
+  /* Commit events are only NULL on ROLLBACK.  We would never write() . */
+  DBUG_ASSERT(commit_event != NULL);
+
   if (likely(is_open()))                       // Should always be true
   {
     uint length;
@@ -1860,6 +1874,7 @@
 
     if (commit_event->write(&log_file))
       goto err;
+
 #ifndef DBUG_OFF
 DBUG_skip_commit:
 #endif

--- 1.204/sql/log_event.cc	2006-03-21 08:35:44 -05:00
+++ 1.205/sql/log_event.cc	2006-06-01 19:27:42 -04:00
@@ -638,7 +638,7 @@
   ulong data_len;
   int result=0;
   char buf[LOG_EVENT_MINIMAL_HEADER_LEN];
-  DBUG_ENTER("read_log_event");
+  DBUG_ENTER("read_log_event(IO_CACHE*, String*, pthread_mutex_t*)");
 
   if (log_lock)
     pthread_mutex_lock(log_lock);
@@ -708,12 +708,14 @@
 Log_event* Log_event::read_log_event(IO_CACHE* file,
 				     pthread_mutex_t* log_lock,
                                      const Format_description_log_event *description_event)
+{
+  DBUG_ENTER("Log_event::read_log_event(IO_CACHE *, pthread_mutex_t *, Format_description_log_event *)");
 #else
 Log_event* Log_event::read_log_event(IO_CACHE* file,
                                      const Format_description_log_event *description_event)
-#endif
 {
-  DBUG_ENTER("Log_event::read_log_event(IO_CACHE *, Format_description_log_event *");
+  DBUG_ENTER("Log_event::read_log_event(IO_CACHE *, Format_description_log_event *)");
+#endif
   DBUG_ASSERT(description_event != 0);
   char head[LOG_EVENT_MINIMAL_HEADER_LEN];
   /*
@@ -1227,6 +1229,18 @@
                           (uint) (start-start_of_status)) ||
           my_b_safe_write(file, (db) ? (byte*) db : (byte*)"", db_len + 1) ||
           my_b_safe_write(file, (byte*) query, q_len)) ? 1 : 0;
+}
+
+
+/*
+  Muted_query_log_event::Muted_query_log_event()
+*/
+Muted_query_log_event::Muted_query_log_event(THD* thd_arg, 
+    const char* query_arg, ulong query_length, bool using_trans, 
+    bool suppress_use)
+  :Query_log_event::Query_log_event(thd_arg, query_arg, query_length, 
+      using_trans, suppress_use)
+{
 }
 
 

--- 1.123/sql/log_event.h	2006-02-25 10:46:25 -05:00
+++ 1.124/sql/log_event.h	2006-06-01 19:27:42 -04:00
@@ -806,6 +806,19 @@
   /* Writes derived event-specific part of post header. */
 };
 
+
+class Muted_query_log_event: public Query_log_event
+{
+public:
+#ifndef MYSQL_CLIENT
+  Muted_query_log_event(THD* thd_arg, const char* query_arg, ulong query_length, bool using_trans, bool suppress_use);
+
+  bool write(IO_CACHE* file) { return(false); };
+  virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; }
+#endif
+};
+
+
 #ifdef HAVE_REPLICATION
 
 /*****************************************************************************

--- 1.49/mysql-test/r/bdb.result	2006-01-06 11:34:51 -05:00
+++ 1.50/mysql-test/r/bdb.result	2006-06-01 19:27:42 -04:00
@@ -1928,4 +1928,38 @@
 commit;
 alter table t1 add primary key(a);
 drop table t1;
+set autocommit=1;
+reset master;
+create table bug16206 (a int) engine=         blackhole;
+insert into bug16206 values(1);
+start transaction;
+insert into bug16206 values(2);
+commit;
+show binlog events;
+Log_name	Pos	Event_type	Server_id	End_log_pos	Info
+f	n	Format_desc	1	n	Server ver: VERSION, Binlog ver: 4
+f	n	Query	1	n	use `test`; create table bug16206 (a int) engine=         blackhole
+f	n	Query	1	n	use `test`; insert into bug16206 values(1)
+f	n	Query	1	n	use `test`; insert into bug16206 values(2)
+drop table bug16206;
+reset master;
+create table bug16206 (a int) engine=         bdb;
+insert into bug16206 values(0);
+insert into bug16206 values(1);
+start transaction;
+insert into bug16206 values(2);
+commit;
+insert into bug16206 values(3);
+show binlog events;
+Log_name	Pos	Event_type	Server_id	End_log_pos	Info
+f	n	Format_desc	1	n	Server ver: VERSION, Binlog ver: 4
+f	n	Query	1	n	use `test`; create table bug16206 (a int) engine=         bdb
+f	n	Query	1	n	use `test`; insert into bug16206 values(0)
+f	n	Query	1	n	use `test`; insert into bug16206 values(1)
+f	n	Query	1	n	use `test`; BEGIN
+f	n	Query	1	n	use `test`; insert into bug16206 values(2)
+f	n	Query	1	n	use `test`; COMMIT
+f	n	Query	1	n	use `test`; insert into bug16206 values(3)
+drop table bug16206;
+set autocommit=0;
 End of 5.0 tests

--- 1.51/mysql-test/t/bdb.test	2006-01-06 11:34:51 -05:00
+++ 1.52/mysql-test/t/bdb.test	2006-06-01 19:27:42 -04:00
@@ -1019,4 +1019,39 @@
 alter table t1 add primary key(a);
 drop table t1;
 
+
+#
+# Bug #16206: Superfluous COMMIT event in binlog when updating BDB in autocommit mode
+#
+set autocommit=1;
+
+let $VERSION=`select version()`;
+
+reset master;
+create table bug16206 (a int) engine=         blackhole;
+insert into bug16206 values(1);
+start transaction;
+insert into bug16206 values(2);
+commit;
+--replace_result $VERSION VERSION
+--replace_column 1 f 2 n 5 n
+show binlog events;
+drop table bug16206;
+
+reset master;
+create table bug16206 (a int) engine=         bdb;
+insert into bug16206 values(0);
+insert into bug16206 values(1);
+start transaction;
+insert into bug16206 values(2);
+commit;
+insert into bug16206 values(3);
+--replace_result $VERSION VERSION
+--replace_column 1 f 2 n 5 n
+show binlog events;
+drop table bug16206;
+
+set autocommit=0;
+
+
 --echo End of 5.0 tests
Thread
bk commit into 5.0 tree (cmiller:1.2162) BUG#16206Chad MILLER2 Jun