Chuck Bell wrote:
> Patch approved pending correction of 3 minor items:
>
> 1) The original repository was bk mysql-6.0-rpl but the bzr tree is now
> being used. Patch must be recommitted under a suitable bzr branch to work.
>
> 2) The test rpl_falcon_bug_36468 failed to execute when placed the folder
> specified in the patch. I was able to get it to run by moving it to the rpl
> suite but...
The test passes if both fixes (36468 and 37221) are in place, and if invoked with the
following command line:
perl mysql-test-run.pl --mysqld=--skip-innodb --mysqld=--default-storage-engine=falcon
--suite=falcon rpl_falcon_bug_36468.test
>
> 3) The same test fails (content mismatch):
>
> ============================================================
>
> TEST RESULT TIME (ms)
> ------------------------------------------------------------
>
> binlog.binlog_autocommit 'row' [ pass ] 164
> Restarting all servers
> binlog.binlog_autocommit 'stmt' [ pass ] 81
> Restarting all servers
> binlog.binlog_autocommit 'mix' [ pass ] 82
> Restarting all servers
> rpl.rpl_falcon_bug_36468 'row' [ pass ] 149
>
> The check of testcase 'rpl.rpl_falcon_bug_36468' failed, this is the
> diff between before and after:
>
> ---
> c:/source/bzr/mysql-6.0-bug-37221/mysql-test/var/tmp/check-mysqld.1.result20
> 08-06-06 19:55:00.267788200 +0300
> +++
> c:\source\bzr\mysql-6.0-bug-37221\mysql-test\var\tmp\check-mysqld.reject2008
> -06-06 19:55:02.583788200 +0300
> @@ -269,6 +269,7 @@
> NULL mysql latin1 latin1_swedish_ci NULL
> NULL test latin1 latin1_swedish_ci NULL
> tables_in_test
> +t1
> tables_in_mysql
> mysql.columns_priv
> mysql.db
>
> mysqltest: Result content mismatch
>
>
> The check of testcase 'rpl.rpl_falcon_bug_36468' failed, this is the
> diff between before and after:
>
> ---
> c:/source/bzr/mysql-6.0-bug-37221/mysql-test/var/tmp/check-mysqld.2.result20
> 08-06-06 19:55:00.726788200 +0300
> +++
> c:\source\bzr\mysql-6.0-bug-37221\mysql-test\var\tmp\check-mysqld.reject2008
> -06-06 19:55:03.508788200 +0300
> @@ -269,6 +269,7 @@
> NULL mysql latin1 latin1_swedish_ci NULL
> NULL test latin1 latin1_swedish_ci NULL
> tables_in_test
> +t1
> tables_in_mysql
> mysql.columns_priv
> mysql.db
>
> mysqltest: Result content mismatch
>
> Stopping all servers...
> Resuming tests...
>
> Restarting all servers
> rpl.rpl_falcon_bug_36468 'stmt' [ fail ]
>
> CURRENT_TEST: rpl.rpl_falcon_bug_36468
> mysqltest: At line 13: query 'INSERT INTO t1 VALUES (1)' failed: 1598:
> Binary lo
> gging not possible. Message: Statement-based format required for this
> statement,
> but not allowed by this combination of engines
>
> The result from queries just before the failure was:
> stop slave;
> drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> reset master;
> reset slave;
> drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
> start slave;
> [master]
> SET GLOBAL BINLOG_FORMAT = 'ROW';
> CREATE TABLE IF NOT EXISTS t1 (id INT) ENGINE = Falcon;
> SET AUTOCOMMIT=0;
> INSERT INTO t1 VALUES (1);
>
> More results from queries before failure can be found in
> c:\source\bzr\mysql-6.0
> -bug-37221\mysql-test\var\log\rpl_falcon_bug_36468.log
>
>
> mysql-test-run: *** ERROR: Test 'rpl.rpl_falcon_bug_36468' failed. To
> continue,
> re-run with '--force'
> Autoreleasing /tmp/mysql-test-ports:200
> Killing: [mysqld.2 - pid: 3652, winpid: 2144]
> Killing: [mysqld.1 - pid: 960, winpid: 4368]
> Killing: [timer - pid: 3956]
>
>> -----Original Message-----
>> From: Mats Kindahl [mailto:mats@stripped]
>> Sent: Thursday, June 05, 2008 6:07 AM
>> To: commits@stripped
>> Subject: bk commit into 6.0 tree (mats:1.2687) BUG#37221
>>
>> Below is the list of changes that have just been committed
>> into a local 6.0 repository of mats. When mats 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, 2008-06-05 12:06:25+02:00,
>> mats@mats-laptop.(none) +6 -0
>> Bug #37221: SET AUTOCOMMIT=1 does not commit binary log
>>
>> When setting AUTOCOMMIT=1 after starting a transaction, the
>> binary log
>> did not commit the outstanding transaction. The reason was
>> that the binary
>> log commit function saw the values of the new settings,
>> deciding that there
>> were nothing to commit.
>>
>> Fixed the problem by moving the implicit commit to before
>> the thread option
>> flags were changed, so that the binary log sees the old
>> values of the flags
>> instead of the values they will take after the statement.
>>
>> mysql-test/extra/binlog_tests/autocommit.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +27 -0
>> New BitKeeper file
>> ``mysql-test/extra/binlog_tests/autocommit.test''
>>
>> mysql-test/extra/binlog_tests/autocommit.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +0 -0
>>
>> mysql-test/suite/binlog/r/binlog_autocommit.result@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +72 -0
>> New BitKeeper file
>> ``mysql-test/suite/binlog/r/binlog_autocommit.result''
>>
>> mysql-test/suite/binlog/r/binlog_autocommit.result@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +0 -0
>>
>> mysql-test/suite/binlog/t/binlog_autocommit.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +18 -0
>> New BitKeeper file
>> ``mysql-test/suite/binlog/t/binlog_autocommit.test''
>>
>> mysql-test/suite/binlog/t/binlog_autocommit.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +0 -0
>>
>> mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +36 -0
>> New BitKeeper file
>> ``mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result''
>>
>> mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +0 -0
>>
>> mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +42 -0
>> New BitKeeper file
>> ``mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test''
>>
>> mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test@stripped,
>> 2008-06-05 12:06:23+02:00, mats@mats-laptop.(none) +0 -0
>>
>> sql/set_var.cc@stripped, 2008-06-05 12:06:23+02:00,
>> mats@mats-laptop.(none) +12 -2
>> Moving implicit commit to be first in
>> set_option_autocommit() so that all
>> involved committers see the old values of option flags.
>>
>> diff -Nrup a/mysql-test/extra/binlog_tests/autocommit.test
>> b/mysql-test/extra/binlog_tests/autocommit.test
>> --- /dev/null Wed Dec 31 16:00:00 196900
>> +++ b/mysql-test/extra/binlog_tests/autocommit.test
>> 2008-06-05 12:06:23 +02:00
>> @@ -0,0 +1,27 @@
>> +# First half of test: setting autocommit outside a transaction RESET
>> +MASTER; SET AUTOCOMMIT=0;
>> +
>> +INSERT INTO t1 VALUES (1);
>> +--echo # Shall not commit the INSERT
>> +SET AUTOCOMMIT=0;
>> +source include/show_binlog_events.inc;
>> +--echo # Shall commit the INSERT
>> +SET AUTOCOMMIT=1;
>> +source include/show_binlog_events.inc;
>> +
>> +# Second half of test: setting autocommit inside a transaction RESET
>> +MASTER; SET AUTOCOMMIT=0;
>> +
>> +BEGIN;
>> +INSERT INTO t1 VALUES (2);
>> +--echo # Shall not commit the INSERT
>> +SET AUTOCOMMIT=0;
>> +source include/show_binlog_events.inc;
>> +--echo # Shall not commit the INSERT either since we are inside a
>> +transaction SET AUTOCOMMIT=1; source include/show_binlog_events.inc;
>> +COMMIT; --echo # Now the INSERT shall be in the binary log source
>> +include/show_binlog_events.inc;
>> diff -Nrup
>> a/mysql-test/suite/binlog/r/binlog_autocommit.result
>> b/mysql-test/suite/binlog/r/binlog_autocommit.result
>> --- /dev/null Wed Dec 31 16:00:00 196900
>> +++ b/mysql-test/suite/binlog/r/binlog_autocommit.result
>> 2008-06-05 12:06:23 +02:00
>> @@ -0,0 +1,72 @@
>> +CREATE TABLE t1 (id INT) ENGINE = InnoDB; SET BINLOG_FORMAT =
>> +'STATEMENT'; RESET MASTER; SET AUTOCOMMIT=0; INSERT INTO t1
>> VALUES (1);
>> +# Shall not commit the INSERT SET AUTOCOMMIT=0; show binlog
>> events from
>> +<binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +# Shall commit the INSERT
>> +SET AUTOCOMMIT=1;
>> +show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +master-bin.000001 # Query # # use
>> `test`; BEGIN
>> +master-bin.000001 # Query # # use
>> `test`; INSERT INTO t1 VALUES (1)
>> +master-bin.000001 # Xid # # COMMIT /* XID */
>> +RESET MASTER;
>> +SET AUTOCOMMIT=0;
>> +BEGIN;
>> +INSERT INTO t1 VALUES (2);
>> +# Shall not commit the INSERT
>> +SET AUTOCOMMIT=0;
>> +show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +# Shall not commit the INSERT either since we are inside a
>> transaction
>> +SET AUTOCOMMIT=1; show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +COMMIT;
>> +# Now the INSERT shall be in the binary log show binlog events from
>> +<binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +master-bin.000001 # Query # # use
>> `test`; BEGIN
>> +master-bin.000001 # Query # # use
>> `test`; INSERT INTO t1 VALUES (2)
>> +master-bin.000001 # Xid # # COMMIT /* XID */
>> +SET BINLOG_FORMAT = 'ROW';
>> +RESET MASTER;
>> +SET AUTOCOMMIT=0;
>> +INSERT INTO t1 VALUES (1);
>> +# Shall not commit the INSERT
>> +SET AUTOCOMMIT=0;
>> +show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +# Shall commit the INSERT
>> +SET AUTOCOMMIT=1;
>> +show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +master-bin.000001 # Query # # use
>> `test`; BEGIN
>> +master-bin.000001 # Table_map # #
>> table_id: # (test.t1)
>> +master-bin.000001 # Write_rows # #
>> table_id: # flags: STMT_END_F
>> +master-bin.000001 # Xid # # COMMIT /* XID */
>> +RESET MASTER;
>> +SET AUTOCOMMIT=0;
>> +BEGIN;
>> +INSERT INTO t1 VALUES (2);
>> +# Shall not commit the INSERT
>> +SET AUTOCOMMIT=0;
>> +show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +# Shall not commit the INSERT either since we are inside a
>> transaction
>> +SET AUTOCOMMIT=1; show binlog events from <binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +COMMIT;
>> +# Now the INSERT shall be in the binary log show binlog events from
>> +<binlog_start>;
>> +Log_name Pos Event_type Server_id
>> End_log_pos Info
>> +master-bin.000001 # Query # # use
>> `test`; BEGIN
>> +master-bin.000001 # Table_map # #
>> table_id: # (test.t1)
>> +master-bin.000001 # Write_rows # #
>> table_id: # flags: STMT_END_F
>> +master-bin.000001 # Xid # # COMMIT /* XID */
>> +DROP TABLE t1;
>> diff -Nrup a/mysql-test/suite/binlog/t/binlog_autocommit.test
>> b/mysql-test/suite/binlog/t/binlog_autocommit.test
>> --- /dev/null Wed Dec 31 16:00:00 196900
>> +++ b/mysql-test/suite/binlog/t/binlog_autocommit.test
>> 2008-06-05 12:06:23 +02:00
>> @@ -0,0 +1,18 @@
>> +# The purpose of this test is to test that setting
>> autocommit does a #
>> +commit of outstanding transactions and nothing is left
>> pending in # the
>> +transaction cache.
>> +
>> +source include/have_log_bin.inc;
>> +source include/have_innodb.inc;
>> +
>> +# We need a transactional engine, so let's use InnoDB CREATE
>> TABLE t1
>> +(id INT) ENGINE = InnoDB;
>> +
>> +SET BINLOG_FORMAT = 'STATEMENT';
>> +source extra/binlog_tests/autocommit.test;
>> +
>> +SET BINLOG_FORMAT = 'ROW';
>> +source extra/binlog_tests/autocommit.test;
>> +
>> +# Cleaning up
>> +DROP TABLE t1;
>> diff -Nrup
>> a/mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result
>> b/mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result
>> --- /dev/null Wed Dec 31 16:00:00 196900
>> +++ b/mysql-test/suite/falcon/r/rpl_falcon_bug_36468.result
>> 2008-06-05 12:06:23 +02:00
>> @@ -0,0 +1,36 @@
>> +stop slave;
>> +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; reset
>> +slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave;
>> +[master] SET GLOBAL BINLOG_FORMAT = 'ROW'; CREATE TABLE IF
>> NOT EXISTS
>> +t1 (id INT) ENGINE = Falcon; SET AUTOCOMMIT=0; INSERT INTO t1 VALUES
>> +(1); SET AUTOCOMMIT=1; SELECT * FROM t1; id
>> +1
>> +[slave]
>> +SELECT * FROM t1;
>> +id
>> +1
>> +[master]
>> +BEGIN;
>> +INSERT INTO t1 VALUES (2);
>> +SET AUTOCOMMIT=1;
>> +[slave]
>> +SELECT * FROM t1 /* Should not contain 2 */; id
>> +1
>> +[master]
>> +INSERT INTO t1 VALUES (3);
>> +COMMIT;
>> +[slave]
>> +SELECT * FROM t1 /* Should contain 2 and 3 */; id
>> +1
>> +2
>> +3
>> diff -Nrup
>> a/mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test
>> b/mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test
>> --- /dev/null Wed Dec 31 16:00:00 196900
>> +++ b/mysql-test/suite/falcon/t/rpl_falcon_bug_36468.test
>> 2008-06-05 12:06:23 +02:00
>> @@ -0,0 +1,42 @@
>> +source include/master-slave.inc;
>> +
>> +--echo [master]
>> +connection master;
>> +SET GLOBAL BINLOG_FORMAT = 'ROW';
>> +
>> +CREATE TABLE IF NOT EXISTS t1 (id INT) ENGINE = Falcon;
>> +
>> +# When switching to AUTOCOMMIT=1, there is an implicit
>> commit if we #
>> +are outside a real transaction.
>> +
>> +SET AUTOCOMMIT=0;
>> +INSERT INTO t1 VALUES (1);
>> +SET AUTOCOMMIT=1;
>> +SELECT * FROM t1;
>> +--echo [slave]
>> +sync_slave_with_master;
>> +SELECT * FROM t1;
>> +
>> +# When inside a transaction, AUTOCOMMIT=1 should not commit the #
>> +transaction. This is hard to test for sure (since delays
>> might cause #
>> +the transaction to not propagate fast enough), but it will
>> not cause #
>> +any false negatives (just false positives).
>> +
>> +--echo [master]
>> +connection master;
>> +BEGIN;
>> +INSERT INTO t1 VALUES (2);
>> +SET AUTOCOMMIT=1;
>> +
>> +--echo [slave]
>> +connection slave;
>> +SELECT * FROM t1 /* Should not contain 2 */;
>> +
>> +--echo [master]
>> +connection master;
>> +INSERT INTO t1 VALUES (3);
>> +COMMIT;
>> +
>> +--echo [slave]
>> +sync_slave_with_master;
>> +SELECT * FROM t1 /* Should contain 2 and 3 */;
>> diff -Nrup a/sql/set_var.cc b/sql/set_var.cc
>> --- a/sql/set_var.cc 2008-05-21 12:04:21 +02:00
>> +++ b/sql/set_var.cc 2008-06-05 12:06:23 +02:00
>> @@ -2970,6 +2970,18 @@ static bool set_option_autocommit(THD *t
>>
>> ulonglong org_options= thd->options;
>>
>> + /*
>> + If we are not in an explicit transaction (started with a BEGIN)
>> + and setting AUTOCOMMIT=1, then we need to commit any outstanding
>> + transactions. If not, the binary log commit function will not
>> + empty the transaction cache since it does not see the end of a
>> + transaction.
>> + */
>> + if (!(thd->options & OPTION_BEGIN) &&
>> + var->save_result.ulong_value != 0 &&
>> + ha_commit(thd))
>> + return 1;
>> +
>> if (var->save_result.ulong_value != 0)
>> thd->options&= ~((sys_var_thd_bit*) var->var)->bit_flag;
>> else
>> @@ -2983,8 +2995,6 @@ static bool set_option_autocommit(THD *t
>> thd->options&= ~(ulonglong) (OPTION_BEGIN | OPTION_KEEP_LOG);
>> thd->transaction.all.modified_non_trans_table= FALSE;
>> thd->server_status|= SERVER_STATUS_AUTOCOMMIT;
>> - if (ha_commit(thd))
>> - return 1;
>> }
>> else
>> {
>>
>> --
>> MySQL Code Commits Mailing List
>> For list archives: http://lists.mysql.com/commits
>> To unsubscribe:
>> http://lists.mysql.com/commits?unsub=1
>>
>
>