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#16206 | Chad MILLER | 2 Jun |