List:Commits« Previous MessageNext Message »
From:Chad MILLER Date:June 12 2006 12:54pm
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/12 08:54:45 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/12 08:54:40 cmiller@zippy.(none) +21 -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/12 08:54:40 cmiller@zippy.(none) +27 -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.cc
    1.189 06/06/12 08:54:40 cmiller@zippy.(none) +17 -5
    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/12 08:54:40 cmiller@zippy.(none) +35 -0
    Add test

  mysql-test/r/bdb.result
    1.50 06/06/12 08:54:40 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-12 08:54:40 -04:00
@@ -36,6 +36,8 @@
 MYSQL_LOG mysql_log, mysql_slow_log, mysql_bin_log;
 ulong sync_binlog_counter= 0;
 
+static Muted_query_log_event invisible_commit;
+
 static bool test_if_number(const char *str,
 			   long *res, bool allow_wildcards);
 static bool binlog_init();
@@ -94,7 +96,9 @@ static int binlog_end_trans(THD *thd, IO
 {
   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 +130,19 @@ static int binlog_commit(THD *thd, bool 
   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
+    DBUG_RETURN(binlog_end_trans(thd, trans_log, &invisible_commit));
 }
 
 static int binlog_rollback(THD *thd, bool all)
@@ -1812,6 +1821,9 @@ bool MYSQL_LOG::write(THD *thd, IO_CACHE
 {
   DBUG_ENTER("MYSQL_LOG::write(THD *, IO_CACHE *, Log_event *)");
   VOID(pthread_mutex_lock(&LOCK_log));
+
+  /* NULL would represent nothing to replicate after ROLLBACK */
+  DBUG_ASSERT(commit_event != NULL);
 
   if (likely(is_open()))                       // Should always be true
   {

--- 1.204/sql/log_event.cc	2006-03-21 08:35:44 -05:00
+++ 1.205/sql/log_event.cc	2006-06-12 08:54:40 -04:00
@@ -1229,6 +1229,18 @@ bool Query_log_event::write(IO_CACHE* fi
           my_b_safe_write(file, (byte*) query, q_len)) ? 1 : 0;
 }
 
+/*
+  Query_log_event::Query_log_event()
+ 
+  The simplest constructor that could possibly work.  This is used for
+  creating static objects that have a special meaning and are invisible
+  to the log.  
+*/
+Query_log_event::Query_log_event()
+  :Log_event(), data_buf(0)
+{
+}
+
 
 /*
   Query_log_event::Query_log_event()
@@ -1871,6 +1883,21 @@ end:
   return (thd->query_error ? thd->query_error : 
           (thd->one_shot_set ? (rli->inc_event_relay_log_pos(),0) :
            Log_event::exec_event(rli))); 
+}
+#endif
+
+
+/**************************************************************************
+	Muted_query_log_event methods
+**************************************************************************/
+
+#ifndef MYSQL_CLIENT
+/*
+  Muted_query_log_event::Muted_query_log_event()
+*/
+Muted_query_log_event::Muted_query_log_event()
+  :Query_log_event()
+{
 }
 #endif
 

--- 1.123/sql/log_event.h	2006-02-25 10:46:25 -05:00
+++ 1.124/sql/log_event.h	2006-06-12 08:54:40 -04:00
@@ -783,6 +783,7 @@ public:
   void print(FILE* file, PRINT_EVENT_INFO* print_event_info= 0);
 #endif
 
+  Query_log_event();
   Query_log_event(const char* buf, uint event_len,
                   const Format_description_log_event *description_event,
                   Log_event_type event_type);
@@ -805,6 +806,26 @@ public:
   virtual ulong get_post_header_size_for_derived() { return 0; }
   /* Writes derived event-specific part of post header. */
 };
+
+
+/*****************************************************************************
+
+  Muted Query Log Event class
+
+  Pretends to Log SQL queries, but doesn't actually do so.
+
+ ****************************************************************************/
+class Muted_query_log_event: public Query_log_event
+{
+public:
+#ifndef MYSQL_CLIENT
+  Muted_query_log_event();
+
+  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-12 08:54:40 -04:00
@@ -1928,4 +1928,38 @@ create table t1 (a int) engine=bdb;
 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-12 08:54:40 -04:00
@@ -1019,4 +1019,39 @@ commit;
 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 MILLER12 Jun