List:Commits« Previous MessageNext Message »
From:Alfranio Correia Date:October 18 2010 2:03am
Subject:Re: bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203)
Bug#56343
View as plain text  
Hi Andrei,

After our irc discussion last Friday, I implemented your suggestions.
Basically, you had suggested to create a static reference to "BEGIN", "COMMIT",
"ROLLBACK" and XID, thus avoiding to allocate such objects every time they are
needed.

Although I agree that the refactory is necessary, I don't think we should do it
now as several tests starting failing due to timeout and mismatch in the result files.
For intance,

  COMMIT
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
-SET @@session.collation_database=DEFAULT/*!*/;
  BEGIN
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
+SET @@session.collation_database=DEFAULT/*!*/;
  LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS
TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`)
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
+SET @@session.collation_database=7/*!*/;
  COMMIT
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
  BEGIN
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
+SET @@session.collation_database=DEFAULT/*!*/;
  LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS
TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`)
  /*!*/;
  SET TIMESTAMP=1000000000/*!*/;
+SET @@session.collation_database=7/*!*/;
  COMMIT

I think this is too risky to be done now as 5.5 is becoming GA soon.
So I will do what you have suggested in next-mr.

Are you ok with this? Can I file a bug report?

Cheers.



On 10/06/2010 09:35 AM, Alfranio Correia wrote:
> #At
> file:///home/acorreia/workspace.sun/repository.mysql.new/bzrwork/bug-56343/mysql-5.5-bugfixing/
> based on revid:mats.kindahl@stripped
>
>   3203 Alfranio Correia	2010-10-06
>        BUG#56343 binlog_cache_use status is bigger than expected
>
>        The binlog_cache_use is incremented twice when changes to a transactional
> table
>        are committed, i.e. TC_LOG_BINLOG::log_xid calls is called. The problem
> happens
>        because log_xid calls both binlog_flush_stmt_cache and binlog_flush_trx_cache
>        without checking if such caches are empty thus unintentionally increasing the
>        binlog_cache_use value twice.
>
>        To fix the problem we avoided incrementing the binlog_cache_use if the cache
> is
>        empty. We also decided to increment binlog_cache_use when the cache is
> truncated
>        as the cache is used although its content is discarded and is not written to
> the
>        binary log.
>
>        Note that binlog_cache_use is incremented for both types of cache,
> transactional
>        and non-transactional and that the behavior presented in this patch also
> applies
>        to the binlog_cache_disk_use.
>
>        Finally, we re-organized the code around the functions binlog_flush_trx_cache
> and
>        binlog_flush_stmt_cache.
>       @ mysql-test/extra/binlog_tests/binlog_cache_stat.test
>          Updated the test case with comments and additional tests to check both
>          transactional and non-transactional changes and what happens when a
>          is transaction either committed or aborted.
>       @ mysql-test/suite/binlog/r/binlog_innodb.result
>          Updated the result file.
>       @ mysql-test/suite/binlog/r/binlog_mixed_cache_stat.result
>          Updated the result file.
>       @ mysql-test/suite/binlog/r/binlog_row_cache_stat.result
>          Updated the result file.
>       @ mysql-test/suite/binlog/r/binlog_stm_cache_stat.result
>          Updated the result file.
>       @ mysql-test/suite/binlog/t/binlog_mixed_cache_stat.test
>          Updated the test case with a new source file.
>       @ mysql-test/suite/binlog/t/binlog_row_cache_stat.test
>          Updated the test case with a new source file.
>       @ mysql-test/suite/binlog/t/binlog_stm_cache_stat.test
>          Updated the test case with a new source file.
>       @ sql/log_event.cc
>          Introduced debug information to check if Query_log_event("BEGIN"),
>          Query_log_event("COMMIT") and Query_log_event("ROLLBACK").
>       @ sql/log_event.h
>          Guaranteed Xid_log_event is always classified as a transactional event.
>
>      renamed:
>        mysql-test/extra/binlog_tests/innodb_stat.test => 
> mysql-test/extra/binlog_tests/binlog_cache_stat.test
>        mysql-test/suite/binlog/r/binlog_mix_innodb_stat.result => 
> mysql-test/suite/binlog/r/binlog_mixed_cache_stat.result
>        mysql-test/suite/binlog/r/binlog_row_innodb_stat.result => 
> mysql-test/suite/binlog/r/binlog_row_cache_stat.result
>        mysql-test/suite/binlog/r/binlog_stm_innodb_stat.result => 
> mysql-test/suite/binlog/r/binlog_stm_cache_stat.result
>        mysql-test/suite/binlog/t/binlog_mix_innodb_stat.test => 
> mysql-test/suite/binlog/t/binlog_mixed_cache_stat.test
>        mysql-test/suite/binlog/t/binlog_row_innodb_stat.test => 
> mysql-test/suite/binlog/t/binlog_row_cache_stat.test
>        mysql-test/suite/binlog/t/binlog_stm_innodb_stat.test => 
> mysql-test/suite/binlog/t/binlog_stm_cache_stat.test
>      modified:
>        mysql-test/suite/binlog/r/binlog_innodb.result
>        sql/log.cc
>        sql/log_event.cc
>        sql/log_event.h
>        mysql-test/extra/binlog_tests/binlog_cache_stat.test
>        mysql-test/suite/binlog/r/binlog_mixed_cache_stat.result
>        mysql-test/suite/binlog/r/binlog_row_cache_stat.result
>        mysql-test/suite/binlog/r/binlog_stm_cache_stat.result
>        mysql-test/suite/binlog/t/binlog_mixed_cache_stat.test
>        mysql-test/suite/binlog/t/binlog_row_cache_stat.test
>        mysql-test/suite/binlog/t/binlog_stm_cache_stat.test
> === renamed file 'mysql-test/extra/binlog_tests/innodb_stat.test' => 
> 'mysql-test/extra/binlog_tests/binlog_cache_stat.test'
> --- a/mysql-test/extra/binlog_tests/innodb_stat.test	2008-09-22 19:15:52 +0000
> +++ b/mysql-test/extra/binlog_tests/binlog_cache_stat.test	2010-10-06 08:34:49 +0000
> @@ -2,22 +2,36 @@
>   -- source include/not_embedded.inc
>   -- source include/have_innodb.inc
>
> +# Creating tables
> +--disable_warnings
> +drop table if exists t1, t2;
> +--enable_warnings
> +
> +create table t1 (a int) engine=innodb;
> +create table t2 (a int) engine=myisam;
> +
>   #
>   # Let us test binlog_cache_use and binlog_cache_disk_use status vars.
> -# Actually this test has nothing to do with innodb per se, it just requires
> -# transactional table.
> +# Actually this test has nothing to do with innodb per se, it just
> +# requires transactional table.
> +#
> +# This test checks binlog_cache_use and binlog_cache_disk_use when
> +# transactions are committed and after when they are aborted.
> +#
> +
> +#
> +# Checking commit.
>   #
> +--echo **** Preparing the enviroment to check commit and its effect on
> +--echo **** the binlog_cache_use and binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
>   flush status;
>   show status like "binlog_cache_use";
>   show status like "binlog_cache_disk_use";
> ---disable_warnings
> -drop table if exists t1;
> ---enable_warnings
>
> -create table t1 (a int) engine=innodb;
> -
> -# Now we are going to create transaction which is long enough so its
> -# transaction binlog will be flushed to disk...
> +--echo **** Now we are going to create transactional changes which are long enough
> so
> +--echo **** they will be flushed to disk...
> +--echo **** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
>   let $1=2000;
>   disable_query_log;
>   begin;
> @@ -31,11 +45,85 @@ enable_query_log;
>   show status like "binlog_cache_use";
>   show status like "binlog_cache_disk_use";
>
> -# Transaction which should not be flushed to disk and so should not
> -# increase binlog_cache_disk_use.
> +--echo **** Transactional changes which should not be flushed to disk and so should
> not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
>   begin;
> -delete from t1;
> +insert into t1 values( 1 );
>   commit;
>   show status like "binlog_cache_use";
>   show status like "binlog_cache_disk_use";
> -drop table t1;
> +
> +--echo **** Non-Transactional changes which should not be flushed to disk and so
> should not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +commit;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +--echo **** Mixed changes which should not be flushed to disk and so should not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
> +commit;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +#
> +# Checking abort.
> +#
> +--echo **** Preparing the enviroment to check abort and its effect on
> +--echo **** the binlog_cache_use and binlog_cache_disk_use
> +--echo **** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
> +flush status;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +--echo **** Now we are going to create transactional changes which are long enough
> so
> +--echo **** they will be flushed to disk...
> +--echo **** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +let $1=2000;
> +disable_query_log;
> +begin;
> +while ($1)
> +{
> + eval insert into t1 values( $1 );
> + dec $1;
> +}
> +rollback;
> +enable_query_log;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +--echo **** Transactional changes which should not be flushed to disk and so should
> not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +--echo **** Non-Transactional changes which should not be flushed to disk and so
> should not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +
> +--echo **** Mixed changes which should not be flushed to disk and so should not
> +--echo **** increase binlog_cache_disk_use.
> +--echo **** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +show status like "binlog_cache_disk_use";
> +drop table t1, t2;
>
> === modified file 'mysql-test/suite/binlog/r/binlog_innodb.result'
> --- a/mysql-test/suite/binlog/r/binlog_innodb.result	2010-06-17 13:31:51 +0000
> +++ b/mysql-test/suite/binlog/r/binlog_innodb.result	2010-10-06 08:34:49 +0000
> @@ -123,7 +123,7 @@ Binlog_cache_disk_use	0
>   create table t1 (a int) engine=innodb;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> -Binlog_cache_use	2
> +Binlog_cache_use	1
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> @@ -132,7 +132,7 @@ delete from t1;
>   commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> -Binlog_cache_use	4
> +Binlog_cache_use	2
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
>
> === renamed file 'mysql-test/suite/binlog/r/binlog_mix_innodb_stat.result' => 
> 'mysql-test/suite/binlog/r/binlog_mixed_cache_stat.result'
> --- a/mysql-test/suite/binlog/r/binlog_mix_innodb_stat.result	2010-01-05 16:55:23
> +0000
> +++ b/mysql-test/suite/binlog/r/binlog_mixed_cache_stat.result	2010-10-06 08:34:49
> +0000
> @@ -1,3 +1,9 @@
> +drop table if exists t1, t2;
> +create table t1 (a int) engine=innodb;
> +create table t2 (a int) engine=myisam;
> +**** Preparing the enviroment to check commit and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
>   flush status;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> @@ -5,21 +11,110 @@ Binlog_cache_use	0
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	0
> -drop table if exists t1;
> -create table t1 (a int) engine=innodb;
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
>   Binlog_cache_use	2
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +commit;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
>   begin;
> -delete from t1;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
>   commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> -Binlog_cache_use	4
> +Binlog_cache_use	5
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Preparing the enviroment to check abort and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
> +flush status;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	0
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	0
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	2
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	5
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> -drop table t1;
> +drop table t1, t2;
>
> === renamed file 'mysql-test/suite/binlog/r/binlog_row_innodb_stat.result' => 
> 'mysql-test/suite/binlog/r/binlog_row_cache_stat.result'
> --- a/mysql-test/suite/binlog/r/binlog_row_innodb_stat.result	2010-01-05 16:55:23
> +0000
> +++ b/mysql-test/suite/binlog/r/binlog_row_cache_stat.result	2010-10-06 08:34:49
> +0000
> @@ -1,3 +1,9 @@
> +drop table if exists t1, t2;
> +create table t1 (a int) engine=innodb;
> +create table t2 (a int) engine=myisam;
> +**** Preparing the enviroment to check commit and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
>   flush status;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> @@ -5,21 +11,110 @@ Binlog_cache_use	0
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	0
> -drop table if exists t1;
> -create table t1 (a int) engine=innodb;
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
>   Binlog_cache_use	2
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +commit;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
>   begin;
> -delete from t1;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
>   commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> -Binlog_cache_use	4
> +Binlog_cache_use	5
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Preparing the enviroment to check abort and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
> +flush status;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	0
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	0
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	2
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	5
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> -drop table t1;
> +drop table t1, t2;
>
> === renamed file 'mysql-test/suite/binlog/r/binlog_stm_innodb_stat.result' => 
> 'mysql-test/suite/binlog/r/binlog_stm_cache_stat.result'
> --- a/mysql-test/suite/binlog/r/binlog_stm_innodb_stat.result	2010-01-05 16:55:23
> +0000
> +++ b/mysql-test/suite/binlog/r/binlog_stm_cache_stat.result	2010-10-06 08:34:49
> +0000
> @@ -1,3 +1,9 @@
> +drop table if exists t1, t2;
> +create table t1 (a int) engine=innodb;
> +create table t2 (a int) engine=myisam;
> +**** Preparing the enviroment to check commit and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
>   flush status;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> @@ -5,21 +11,110 @@ Binlog_cache_use	0
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	0
> -drop table if exists t1;
> -create table t1 (a int) engine=innodb;
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
>   Binlog_cache_use	2
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +commit;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
>   begin;
> -delete from t1;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
>   commit;
>   show status like "binlog_cache_use";
>   Variable_name	Value
> -Binlog_cache_use	4
> +Binlog_cache_use	5
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Preparing the enviroment to check abort and its effect on
> +**** the binlog_cache_use and binlog_cache_disk_use
> +**** Expected: binlog_cache_use = 0, binlog_cache_disk_use = 0.
> +flush status;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	0
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	0
> +**** Now we are going to create transactional changes which are long enough so
> +**** they will be flushed to disk...
> +**** Expected: binlog_cache_use = 1, binlog_cache_disk_use = 1.
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	1
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Transactional changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 2, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +rollback;
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	2
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Non-Transactional changes which should not be flushed to disk and so should
> not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 3, binlog_cache_disk_use = 1.
> +begin;
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	3
> +show status like "binlog_cache_disk_use";
> +Variable_name	Value
> +Binlog_cache_disk_use	1
> +**** Mixed changes which should not be flushed to disk and so should not
> +**** increase binlog_cache_disk_use.
> +**** Expected: binlog_cache_use = 5, binlog_cache_disk_use = 1.
> +begin;
> +insert into t1 values( 1 );
> +insert into t2 values( 1 );
> +rollback;
> +Warnings:
> +Warning	1196	Some non-transactional changed tables couldn't be rolled back
> +show status like "binlog_cache_use";
> +Variable_name	Value
> +Binlog_cache_use	5
>   show status like "binlog_cache_disk_use";
>   Variable_name	Value
>   Binlog_cache_disk_use	1
> -drop table t1;
> +drop table t1, t2;
>
> === renamed file 'mysql-test/suite/binlog/t/binlog_mix_innodb_stat.test' => 
> 'mysql-test/suite/binlog/t/binlog_mixed_cache_stat.test'
> --- a/mysql-test/suite/binlog/t/binlog_mix_innodb_stat.test	2008-09-08 20:23:55
> +0000
> +++ b/mysql-test/suite/binlog/t/binlog_mixed_cache_stat.test	2010-10-06 08:34:49
> +0000
> @@ -2,4 +2,4 @@
>   # For both statement and row based bin logs 9/19/2005 [jbm]
>
>   -- source include/have_binlog_format_mixed.inc
> --- source extra/binlog_tests/innodb_stat.test
> +-- source extra/binlog_tests/binlog_cache_stat.test
>
> === renamed file 'mysql-test/suite/binlog/t/binlog_row_innodb_stat.test' => 
> 'mysql-test/suite/binlog/t/binlog_row_cache_stat.test'
> --- a/mysql-test/suite/binlog/t/binlog_row_innodb_stat.test	2007-06-27 12:28:02
> +0000
> +++ b/mysql-test/suite/binlog/t/binlog_row_cache_stat.test	2010-10-06 08:34:49 +0000
> @@ -2,4 +2,4 @@
>   # For both statement and row based bin logs 9/19/2005 [jbm]
>
>   -- source include/have_binlog_format_row.inc
> --- source extra/binlog_tests/innodb_stat.test
> +-- source extra/binlog_tests/binlog_cache_stat.test
>
> === renamed file 'mysql-test/suite/binlog/t/binlog_stm_innodb_stat.test' => 
> 'mysql-test/suite/binlog/t/binlog_stm_cache_stat.test'
> --- a/mysql-test/suite/binlog/t/binlog_stm_innodb_stat.test	2008-09-08 20:23:55
> +0000
> +++ b/mysql-test/suite/binlog/t/binlog_stm_cache_stat.test	2010-10-06 08:34:49 +0000
> @@ -2,4 +2,4 @@
>   # For both statement and row based bin logs 9/19/2005 [jbm]
>
>   -- source include/have_binlog_format_statement.inc
> --- source extra/binlog_tests/innodb_stat.test
> +-- source extra/binlog_tests/binlog_cache_stat.test
>
> === modified file 'sql/log.cc'
> --- a/sql/log.cc	2010-09-06 17:18:44 +0000
> +++ b/sql/log.cc	2010-10-06 08:34:49 +0000
> @@ -210,6 +210,9 @@ class binlog_cache_data
>   public:
>     binlog_cache_data(): m_pending(0), before_stmt_pos(MY_OFF_T_UNDEF),
>     incident(FALSE), changes_to_non_trans_temp_table_flag(FALSE)
> +#ifndef DBUG_OFF
> +  , has_trans(FALSE)
> +#endif
>     {
>       cache_log.end_of_file= max_binlog_cache_size;
>     }
> @@ -262,6 +265,14 @@ public:
>       incident= FALSE;
>       before_stmt_pos= MY_OFF_T_UNDEF;
>       cache_log.end_of_file= max_binlog_cache_size;
> +    /*
> +      When a truncate is called there may be write activity and by consequence
> +      "disk_writes" is increased. This breaks the "disk_writes"' use by the
> +      binary log which aims to compute the ratio between in-memory cache usage
> +      and disk cache usage. To avoid this undesirable behavior, we reset the
> +      variable after truncating the cache.
> +    */
> +    cache_log.disk_writes= 0;
>       DBUG_ASSERT(empty());
>     }
>
> @@ -292,6 +303,18 @@ public:
>         before_stmt_pos= MY_OFF_T_UNDEF;
>     }
>
> +#ifndef DBUG_OFF
> +  bool is_transactional()
> +  {
> +    return(has_trans);
> +  }
> +
> +  void set_transactional(bool is_transactional)
> +  {
> +    has_trans= is_transactional;
> +  }
> +#endif
> +
>     /*
>       Cache to store data before copying it to the binary log.
>     */
> @@ -321,6 +344,13 @@ private:
>     */
>     bool changes_to_non_trans_temp_table_flag;
>
> +#ifndef DBUG_OFF
> +  /*
> +    Defines the type of the cache either: transactional or non-transactional.
> +  */
> +  bool has_trans;
> +#endif
> +
>     /*
>       It truncates the cache to a certain position. This includes deleting the
>       pending event.
> @@ -1506,57 +1536,147 @@ static int binlog_close_connection(handl
>   }
>
>   /**
> -  This function flushes a transactional cache upon commit/rollback.
> -
> -  @param thd        The thread whose transaction should be flushed
> -  @param cache_mngr Pointer to the cache data to be flushed
> -  @param end_ev     The end event either commit/rollback.
> +  This function computes binlog cache and disk usage.
>
> -  @return
> -    nonzero if an error pops up when flushing the transactional cache.
> +  @param cache_data  Pointer to the cache where data is
> +                     stored.
>   */
> -static int
> -binlog_flush_trx_cache(THD *thd, binlog_cache_mngr *cache_mngr,
> -                       Log_event *end_ev)
> +static inline void
> +binlog_compute_statistics(binlog_cache_data* cache_data)
>   {
> -  DBUG_ENTER("binlog_flush_trx_cache");
> -  int error=0;
> -  IO_CACHE *cache_log=&cache_mngr->trx_cache.cache_log;
> +  if (!cache_data->empty())
> +  {
> +    statistic_increment(binlog_cache_use,&LOCK_status);
> +    if (cache_data->cache_log.disk_writes != 0)
> +      statistic_increment(binlog_cache_disk_use,&LOCK_status);
> +  }
> +}
>
> -  /*
> -    This function handles transactional changes and as such
> -    this flag equals to true.
> -  */
> -  bool const is_transactional= TRUE;
> +/**
> +  This function flushes a cache upon commit/rollback.
>
> -  if (thd->binlog_flush_pending_rows_event(TRUE, is_transactional))
> -    DBUG_RETURN(1);
> -  /*
> -    Doing a commit or a rollback including non-transactional tables,
> -    i.e., ending a transaction where we might write the transaction
> -    cache to the binary log.
> +  @param thd                The thread whose transaction should be flushed
> +  @param cache_data         Pointer to the cache
> +  @param end_ev             The end event either commit/rollback
> +  @param is_transactional   The type of the cache: transactional or
> +                            non-transactional
>
> -    We can always end the statement when ending a transaction since
> -    transactions are not allowed inside stored functions. If they
> -    were, we would have to ensure that we're not ending a statement
> -    inside a stored function.
> -  */
> -  error= mysql_bin_log.write(thd,&cache_mngr->trx_cache.cache_log, end_ev,
> -                             cache_mngr->trx_cache.has_incident());
> -  cache_mngr->reset_cache(&cache_mngr->trx_cache);
> +  @return
> +    nonzero if an error pops up when flushing the cache.
> +*/
> +static inline int
> +binlog_flush_cache(THD *thd, binlog_cache_data* cache_data, Log_event *end_evt,
> +                   bool is_transactional)
> +{
> +  DBUG_ENTER("binlog_flush_cache");
> +  int error= 0;
>
> -  statistic_increment(binlog_cache_use,&LOCK_status);
> -  if (cache_log->disk_writes != 0)
> +  if (!cache_data->empty())
>     {
> -    statistic_increment(binlog_cache_disk_use,&LOCK_status);
> -    cache_log->disk_writes= 0;
> +#ifndef DBUG_OFF
> +    DBUG_PRINT("info", ("is_transactional(%d), event(%d), cache_data(%d)",
> +               is_transactional, end_evt->use_trans_cache(),
> +               cache_data->is_transactional()));
> +    DBUG_ASSERT(is_transactional == end_evt->use_trans_cache()&&
> +                is_transactional == cache_data->is_transactional());
> +#endif
> +    if (thd->binlog_flush_pending_rows_event(TRUE, is_transactional))
> +      DBUG_RETURN(1);
> +    /*
> +      Doing a commit or a rollback including non-transactional tables,
> +      i.e., ending a transaction where we might write the transaction
> +      cache to the binary log.
> +
> +      We can always end the statement when ending a transaction since
> +      transactions are not allowed inside stored functions. If they
> +      were, we would have to ensure that we're not ending a statement
> +      inside a stored function.
> +    */
> +    error= mysql_bin_log.write(thd,&cache_data->cache_log, end_evt,
> +                               cache_data->has_incident());
>     }
> +  binlog_compute_statistics(cache_data);
> +  cache_data->reset();
>
> -  DBUG_ASSERT(cache_mngr->trx_cache.empty());
> +  DBUG_ASSERT(cache_data->empty());
>     DBUG_RETURN(error);
>   }
>
>   /**
> +  This function flushes the stmt-cache upon commit.
> +
> +  @param thd                The thread whose transaction should be flushed
> +  @param cache_mngr         Pointer to the cache manager
> +
> +  @return
> +    nonzero if an error pops up when flushing the cache.
> +*/
> +static inline int
> +binlog_commit_flush_stmt_cache(THD *thd,
> +                               binlog_cache_mngr *cache_mngr)
> +{
> +  Query_log_event end_evt(thd, STRING_WITH_LEN("COMMIT"),
> +                          FALSE, FALSE, TRUE, 0);
> +  return (binlog_flush_cache(thd,&cache_mngr->stmt_cache,&end_evt,
> +                             FALSE));
> +}
> +
> +/**
> +  This function flushes the trx-cache upon commit.
> +
> +  @param thd                The thread whose transaction should be flushed
> +  @param cache_mngr         Pointer to the cache manager
> +
> +  @return
> +    nonzero if an error pops up when flushing the cache.
> +*/
> +static inline int
> +binlog_commit_flush_trx_cache(THD *thd, binlog_cache_mngr *cache_mngr)
> +{
> +  Query_log_event end_evt(thd, STRING_WITH_LEN("COMMIT"),
> +                          TRUE, FALSE, TRUE, 0);
> +  return (binlog_flush_cache(thd,&cache_mngr->trx_cache,&end_evt,
> +                             TRUE));
> +}
> +
> +/**
> +  This function flushes the trx-cache upon rollback.
> +
> +  @param thd                The thread whose transaction should be flushed
> +  @param cache_mngr         Pointer to the cache manager
> +
> +  @return
> +    nonzero if an error pops up when flushing the cache.
> +*/
> +static inline int
> +binlog_rollback_flush_trx_cache(THD *thd, binlog_cache_mngr *cache_mngr)
> +{
> +  Query_log_event end_evt(thd, STRING_WITH_LEN("ROLLBACK"),
> +                          TRUE, FALSE, TRUE, 0);
> +  return (binlog_flush_cache(thd,&cache_mngr->trx_cache,&end_evt,
> +                             TRUE));
> +}
> +
> +/**
> +  This function flushes the trx-cache upon commit.
> +
> +  @param thd                The thread whose transaction should be flushed
> +  @param cache_mngr         Pointer to the cache manager
> +  @param xid                Transaction Id
> +
> +  @return
> +    nonzero if an error pops up when flushing the cache.
> +*/
> +static inline int
> +binlog_commit_flush_trx_cache(THD *thd, binlog_cache_mngr *cache_mngr,
> +                              my_xid xid)
> +{
> +  Xid_log_event end_evt(thd, xid);
> +  return (binlog_flush_cache(thd,&cache_mngr->trx_cache,&end_evt,
> +                             TRUE));
> +}
> +
> +/**
>     This function truncates the transactional cache upon committing or rolling
>     back either a transaction or a statement.
>
> @@ -1579,23 +1699,26 @@ binlog_truncate_trx_cache(THD *thd, binl
>     */
>     bool const is_transactional= TRUE;
>
> -  DBUG_PRINT("info", ("thd->options={ %s%s}, transaction: %s",
> +  DBUG_PRINT("info", ("thd->options={ %s %s}, transaction: %s",
>                         FLAGSTR(thd->variables.option_bits,
> OPTION_NOT_AUTOCOMMIT),
>                         FLAGSTR(thd->variables.option_bits, OPTION_BEGIN),
>                         all ? "all" : "stmt"));
> +
> +  thd->binlog_remove_pending_rows_event(TRUE, is_transactional);
>     /*
>       If rolling back an entire transaction or a single statement not
>       inside a transaction, we reset the transaction cache.
>     */
> -  thd->binlog_remove_pending_rows_event(TRUE, is_transactional);
>     if (ending_trans(thd, all))
>     {
>       if (cache_mngr->trx_cache.has_incident())
>         error= mysql_bin_log.write_incident(thd, TRUE);
>
> -    cache_mngr->reset_cache(&cache_mngr->trx_cache);
> -
>       thd->clear_binlog_table_maps();
> +
> +    binlog_compute_statistics(&cache_mngr->trx_cache);
> +
> +    cache_mngr->reset_cache(&cache_mngr->trx_cache);
>     }
>     /*
>       If rolling back a statement in a transaction, we truncate the
> @@ -1620,51 +1743,6 @@ static int binlog_prepare(handlerton *ht
>   }
>
>   /**
> -  This function flushes the non-transactional to the binary log upon
> -  committing or rolling back a statement.
> -
> -  @param thd        The thread whose transaction should be flushed
> -  @param cache_mngr Pointer to the cache data to be flushed
> -
> -  @return
> -    nonzero if an error pops up when flushing the non-transactional cache.
> -*/
> -static int
> -binlog_flush_stmt_cache(THD *thd, binlog_cache_mngr *cache_mngr)
> -{
> -  int error= 0;
> -  DBUG_ENTER("binlog_flush_stmt_cache");
> -  /*
> -    If we are flushing the statement cache, it means that the changes get
> -    through otherwise the cache is empty and this routine should not be called.
> -  */
> -  DBUG_ASSERT(cache_mngr->stmt_cache.has_incident() == FALSE);
> -  /*
> -    This function handles non-transactional changes and as such this flag equals
> -    to false.
> -  */
> -  bool const is_transactional= FALSE;
> -  IO_CACHE *cache_log=&cache_mngr->stmt_cache.cache_log;
> -
> -  if (thd->binlog_flush_pending_rows_event(TRUE, is_transactional))
> -    DBUG_RETURN(1);
> -
> -  Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, FALSE, TRUE, 0);
> -  if ((error= mysql_bin_log.write(thd, cache_log,&qev,
> -                                  cache_mngr->stmt_cache.has_incident())))
> -    DBUG_RETURN(error);
> -  cache_mngr->reset_cache(&cache_mngr->stmt_cache);
> -
> -  statistic_increment(binlog_cache_use,&LOCK_status);
> -  if (cache_log->disk_writes != 0)
> -  {
> -    statistic_increment(binlog_cache_disk_use,&LOCK_status);
> -    cache_log->disk_writes= 0;
> -  }
> -  DBUG_RETURN(error);
> -}
> -
> -/**
>     This function is called once after each statement.
>
>     It has the responsibility to flush the caches to the binary log on commits.
> @@ -1690,19 +1768,7 @@ static int binlog_commit(handlerton *hto
>                 YESNO(thd->transaction.all.modified_non_trans_table),
>                 YESNO(thd->transaction.stmt.modified_non_trans_table)));
>
> -  if (!cache_mngr->stmt_cache.empty())
> -  {
> -    binlog_flush_stmt_cache(thd, cache_mngr);
> -  }
> -
> -  if (cache_mngr->trx_cache.empty())
> -  {
> -    /*
> -      we're here because cache_log was flushed in MYSQL_BIN_LOG::log_xid()
> -    */
> -    cache_mngr->reset_cache(&cache_mngr->trx_cache);
> -    DBUG_RETURN(0);
> -  }
> +  binlog_commit_flush_stmt_cache(thd, cache_mngr);
>
>     /*
>       We commit the transaction if:
> @@ -1711,16 +1777,14 @@ static int binlog_commit(handlerton *hto
>       Otherwise, we accumulate the changes.
>     */
>     if (ending_trans(thd, all))
> -  {
> -    Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, FALSE, TRUE, 0);
> -    error= binlog_flush_trx_cache(thd, cache_mngr,&qev);
> -  }
> +    error= binlog_commit_flush_trx_cache(thd, cache_mngr);
>
>     /*
>       This is part of the stmt rollback.
>     */
>     if (!all)
>       cache_mngr->trx_cache.set_prev_position(MY_OFF_T_UNDEF);
> +
>     DBUG_RETURN(error);
>   }
>
> @@ -1755,19 +1819,8 @@ static int binlog_rollback(handlerton *h
>       error= mysql_bin_log.write_incident(thd, TRUE);
>       cache_mngr->reset_cache(&cache_mngr->stmt_cache);
>     }
> -  else if (!cache_mngr->stmt_cache.empty())
> -  {
> -    binlog_flush_stmt_cache(thd, cache_mngr);
> -  }
> -
> -  if (cache_mngr->trx_cache.empty())
> -  {
> -    /*
> -      we're here because cache_log was flushed in MYSQL_BIN_LOG::log_xid()
> -    */
> -    cache_mngr->reset_cache(&cache_mngr->trx_cache);
> -    DBUG_RETURN(0);
> -  }
> +  else
> +    binlog_commit_flush_stmt_cache(thd, cache_mngr);
>
>     if (mysql_bin_log.check_write_error(thd))
>     {
> @@ -1796,7 +1849,6 @@ static int binlog_rollback(handlerton *h
>           . the format is MIXED, non-trans table was updated and
>             aborting a single statement transaction;
>       */
> -
>       if (ending_trans(thd, all)&&
>           ((thd->variables.option_bits&  OPTION_KEEP_LOG) ||
>            (trans_has_updated_non_trans_table(thd)&&
> @@ -1806,10 +1858,7 @@ static int binlog_rollback(handlerton *h
>            (trans_has_updated_non_trans_table(thd)&&
>             ending_single_stmt_trans(thd,all)&&
>             thd->variables.binlog_format == BINLOG_FORMAT_MIXED)))
> -    {
> -      Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, FALSE, TRUE, 0);
> -      error= binlog_flush_trx_cache(thd, cache_mngr,&qev);
> -    }
> +      error= binlog_rollback_flush_trx_cache(thd, cache_mngr);
>       /*
>         Truncate the cache if:
>           . aborting a single or multi-statement transaction or;
> @@ -1832,7 +1881,8 @@ static int binlog_rollback(handlerton *h
>       This is part of the stmt rollback.
>     */
>     if (!all)
> -    cache_mngr->trx_cache.set_prev_position(MY_OFF_T_UNDEF);
> +    cache_mngr->trx_cache.set_prev_position(MY_OFF_T_UNDEF);
> +
>     DBUG_RETURN(error);
>   }
>
> @@ -4364,6 +4414,11 @@ int THD::binlog_setup_trx_data()
>
>     cache_mngr= new (thd_get_ha_data(this, binlog_hton)) binlog_cache_mngr;
>
> +#ifndef DBUG_OFF
> +  cache_mngr->trx_cache.set_transactional(TRUE);
> +  cache_mngr->stmt_cache.set_transactional(FALSE);
> +#endif
> +
>     DBUG_RETURN(0);
>   }
>
> @@ -6291,15 +6346,14 @@ void TC_LOG_BINLOG::close()
>   int TC_LOG_BINLOG::log_xid(THD *thd, my_xid xid)
>   {
>     DBUG_ENTER("TC_LOG_BINLOG::log");
> -  Xid_log_event xle(thd, xid);
>     binlog_cache_mngr *cache_mngr=
>       (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
>     /*
>       We always commit the entire transaction when writing an XID. Also
>       note that the return value is inverted.
>      */
> -  DBUG_RETURN(!binlog_flush_stmt_cache(thd, cache_mngr)&&
> -              !binlog_flush_trx_cache(thd, cache_mngr,&xle));
> +  DBUG_RETURN(!binlog_commit_flush_stmt_cache(thd, cache_mngr)&&
> +              !binlog_commit_flush_trx_cache(thd, cache_mngr, xid));
>   }
>
>   void TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid)
>
> === modified file 'sql/log_event.cc'
> --- a/sql/log_event.cc	2010-08-23 22:31:12 +0000
> +++ b/sql/log_event.cc	2010-10-06 08:34:49 +0000
> @@ -2537,6 +2537,22 @@ Query_log_event::Query_log_event(THD* th
>     bool trx_cache= FALSE;
>     cache_type= Log_event::EVENT_INVALID_CACHE;
>
> +#ifndef DBUG_OFF
> +  /*
> +    If debug is enabled, we make sure that begin, commit and rollback
> +    have the cache_type exclusively defined by the param using_trans.
> +    as this is important while checking if the correct cache is used.
> +
> +    Note this is the only way to accurately set the type of the cache
> +    when a begin, commit or rollback event is created because such
> +    events may be artificially produced to compose the binary log.
> +  */
> +  if (strncmp("BEGIN", query_arg, query_length)&&
> +      strncmp("COMMIT", query_arg, query_length)&&
> +      strncmp("ROLLBACK", query_arg, query_length))
> +  {
> +#endif
> +
>     switch (lex->sql_command)
>     {
>       case SQLCOM_DROP_TABLE:
> @@ -2574,6 +2590,15 @@ Query_log_event::Query_log_event(THD* th
>       cache_type= Log_event::EVENT_TRANSACTIONAL_CACHE;
>     else
>       cache_type= Log_event::EVENT_STMT_CACHE;
> +
> +#ifndef DBUG_OFF
> +  }
> +  else if (using_trans)
> +    cache_type= Log_event::EVENT_TRANSACTIONAL_CACHE;
> +  else
> +    cache_type= Log_event::EVENT_STMT_CACHE;
> +#endif
> +
>     DBUG_ASSERT(cache_type != Log_event::EVENT_INVALID_CACHE);
>     DBUG_PRINT("info",("Query_log_event has flags2: %lu  sql_mode: %lu",
>                        (ulong) flags2, sql_mode));
>
> === modified file 'sql/log_event.h'
> --- a/sql/log_event.h	2010-07-15 13:47:50 +0000
> +++ b/sql/log_event.h	2010-10-06 08:34:49 +0000
> @@ -2504,7 +2504,7 @@ class Xid_log_event: public Log_event
>      my_xid xid;
>
>   #ifdef MYSQL_SERVER
> -  Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg,0,0), xid(x) {}
> +  Xid_log_event(THD* thd_arg, my_xid x): Log_event(thd_arg, 0, TRUE), xid(x) {}
>   #ifdef HAVE_REPLICATION
>     void pack_info(Protocol* protocol);
>   #endif /* HAVE_REPLICATION */
>
>
>
>
>

Thread
bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203) Bug#56343Alfranio Correia6 Oct
  • Re: bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203)Bug#56343Luís Soares14 Oct
    • Re: bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203)Bug#56343Alfranio Correia18 Oct
      • Re: bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203)Bug#56343Luís Soares5 Nov
  • Re: bzr commit into mysql-5.5-bugfixing branch (alfranio.correia:3203)Bug#56343Alfranio Correia18 Oct