From: Tor Didriksen Date: September 23 2010 8:50am Subject: bzr push into mysql-next-mr-opt-team branch (tor.didriksen:3219 to 3220) List-Archive: http://lists.mysql.com/commits/118909 Message-Id: <20100923085147.C7EA03766@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4935919092639462246==" --===============4935919092639462246== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3220 Tor Didriksen 2010-09-23 [merge] Auto-merge: next-mr-opt-backporting => next-mr-opt-team added: mysql-test/include/rpl_assert.inc mysql-test/suite/perfschema/r/checksum.result mysql-test/suite/perfschema/t/checksum.test modified: dbug/dbug.c include/mysql/service_my_snprintf.h libservices/HOWTO mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc mysql-test/extra/rpl_tests/rpl_binlog_max_cache_size.test mysql-test/include/wait_for_slave_param.inc mysql-test/r/variables.result mysql-test/suite/perfschema/r/server_init.result mysql-test/suite/perfschema/t/server_init.test mysql-test/suite/rpl/r/rpl_delayed_slave.result mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result mysql-test/suite/rpl/t/rpl_delayed_slave.test mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size-master.opt mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size-master.opt mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size-master.opt mysql-test/suite/sys_vars/r/max_binlog_cache_size_basic.result mysql-test/suite/sys_vars/t/max_binlog_cache_size_basic.test mysql-test/t/variables.test mysql-test/valgrind.supp packaging/WiX/mysql_server.wxs.in sql/binlog.cc sql/binlog.h sql/mysqld.cc sql/rpl_master.cc sql/rpl_rli.cc sql/rpl_slave.cc sql/share/errmsg-utf8.txt sql/sql_binlog.cc sql/sql_plugin.cc sql/sql_select.cc sql/sql_select.h sql/sys_vars.cc storage/perfschema/pfs_engine_table.cc storage/perfschema/table_events_waits.cc storage/perfschema/table_events_waits.h strings/my_vsnprintf.c unittest/mysys/my_vsnprintf-t.c 3219 Tor Didriksen 2010-09-20 [merge] Automerge from next-mr-opt-backporting modified: mysql-test/include/subquery_sj.inc mysql-test/r/subquery_sj_all.result mysql-test/r/subquery_sj_all_jcl6.result mysql-test/r/subquery_sj_all_jcl7.result mysql-test/r/subquery_sj_dupsweed.result mysql-test/r/subquery_sj_dupsweed_jcl6.result mysql-test/r/subquery_sj_dupsweed_jcl7.result mysql-test/r/subquery_sj_firstmatch.result mysql-test/r/subquery_sj_firstmatch_jcl6.result mysql-test/r/subquery_sj_firstmatch_jcl7.result mysql-test/r/subquery_sj_loosescan.result mysql-test/r/subquery_sj_loosescan_jcl6.result mysql-test/r/subquery_sj_loosescan_jcl7.result mysql-test/r/subquery_sj_mat.result mysql-test/r/subquery_sj_mat_jcl6.result mysql-test/r/subquery_sj_mat_jcl7.result mysql-test/r/subquery_sj_mat_nosj.result mysql-test/r/subquery_sj_none.result mysql-test/r/subquery_sj_none_jcl6.result mysql-test/r/subquery_sj_none_jcl7.result sql/item_subselect.cc sql/sql_select.cc === modified file 'dbug/dbug.c' --- a/dbug/dbug.c 2010-07-15 11:41:37 +0000 +++ b/dbug/dbug.c 2010-09-15 11:51:29 +0000 @@ -1335,15 +1335,11 @@ void _db_doprnt_(const char *format,...) * This function is intended as a * vfprintf clone with consistent, platform independent output for * problematic formats like %p, %zd and %lld. - * However: full functionality for my_vsnprintf has not been backported yet, - * so code using "%g" or "%f" will have undefined behaviour. */ static void DbugVfprintf(FILE *stream, const char* format, va_list args) { char cvtbuf[1024]; - size_t len; - /* Do not use my_vsnprintf, it does not support "%g". */ - len = vsnprintf(cvtbuf, sizeof(cvtbuf), format, args); + (void) my_vsnprintf(cvtbuf, sizeof(cvtbuf), format, args); (void) fprintf(stream, "%s\n", cvtbuf); } === modified file 'include/mysql/service_my_snprintf.h' --- a/include/mysql/service_my_snprintf.h 2010-07-20 19:34:20 +0000 +++ b/include/mysql/service_my_snprintf.h 2010-09-15 11:33:22 +0000 @@ -53,7 +53,7 @@ can be 'l', 'll', or 'z'. Supported formats are 's' (null pointer is accepted, printed as - "(null)"), 'b' (extension, see below), 'c', 'd', 'u', 'x', 'o', + "(null)"), 'b' (extension, see below), 'c', 'd', 'i', 'u', 'x', 'o', 'X', 'p' (works as 0x%x). Standard syntax for positional arguments $n is supported. === modified file 'libservices/HOWTO' --- a/libservices/HOWTO 2009-11-02 20:05:42 +0000 +++ b/libservices/HOWTO 2010-09-21 13:05:38 +0000 @@ -71,7 +71,7 @@ it should also declare all the accompany #define VERSION_foo 0x0100 ================================================================== -7. create a new file libservices/foo_service.h using the following template: +7. create a new file libservices/foo_service.c using the following template: ================================================================== /* GPL header */ #include === modified file 'mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc' --- a/mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc 2010-06-21 10:44:26 +0000 +++ b/mysql-test/extra/rpl_tests/delayed_slave_wait_on_query.inc 2010-09-16 11:00:57 +0000 @@ -10,21 +10,32 @@ # - After one and a half delay, check the status. It should not be # delaying and the query should be executed. # +# # ==== Usage ==== # +# --let $query_number= 4 # --source extra/rpl_tests/delayed_slave_wait_on_query.inc +# +# Parameters: +# $query_number +# The value of the 'b' column in t1 for the row inserted by the query +# we are waiting for. connection master; + --echo [on slave] --let $slave_timeout= $time1 - --source include/sync_slave_io_with_master.inc --echo # sleep 1*T --sleep $time1 ---echo # Expect query not executed and status is 'Waiting until MASTER_DELAY...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= Query $query_number should not be executed +--let $assert_cond= MAX(b) < $query_number FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Waiting until MASTER_DELAY...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Waiting until MASTER_DELAY%" +--source include/rpl_assert.inc --echo # sleep 1*T --sleep $time1 @@ -32,8 +43,13 @@ SELECT * FROM t1 ORDER BY b DESC LIMIT 1 --echo # sync with master (with timeout 1*T) --source include/sync_with_master.inc ---echo # Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= Query $query_number should be executed +--let $assert_cond= MAX(b) = $query_number FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Has read all relay log...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Slave has read all relay log%" +--source include/rpl_assert.inc + --source include/check_slave_is_running.inc === modified file 'mysql-test/extra/rpl_tests/rpl_binlog_max_cache_size.test' --- a/mysql-test/extra/rpl_tests/rpl_binlog_max_cache_size.test 2010-06-30 20:56:21 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_binlog_max_cache_size.test 2010-09-06 16:21:15 +0000 @@ -1,11 +1,13 @@ ######################################################################################## -# This test verifies if the binlog is not corrupted when the cache buffer is not -# big enough to accommodate the changes and is divided in five steps: +# This test does two things. First it verifies if the binlog is not corrupted when +# the cache buffer is not big enough to accommodate the changes and is divided in +# five steps: # # 1 - Single Statements: -# 1.1 - Single statement on transactional table. -# 1.2 - Single statement on non-transactional table. -# 1.3 - Single statement on both transactional and non-transactional tables. +# 1.1 - Single statement on transactional table. +# 1.2 - Single statement on non-transactional table. +# 1.3 - Single statement on both transactional and non-transactional tables. +# # In both 1.2 and 1.3, an incident event is logged to notify the user that the # master and slave are diverging. # @@ -19,10 +21,14 @@ # table. In this case, a failure means that the statement does not get into # the cache and an incident event is logged to notify the user that the master # and slave are diverging. -# +# +# Then it checks what happens when we try to set BINLOG_CACHE_SIZE to a value that +# is greater than MAX_BINLOG_CACHE_SIZE and vice-versa. In both cases, We expect +# that BINLOG_CACHE_SIZE will be set to MAX_BINLOG_CACHE_SIZE. (BUG#55377) ######################################################################################## call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Option binlog_cache_size "); CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MyIsam; @@ -374,10 +380,29 @@ let $diff_statement= SELECT * FROM t1; --source include/diff_master_slave.inc --echo ######################################################################################## +--echo # CHECK MAX_BINLOG_CACHE_SIZE and BINLOG_CACHE_SIZE +--echo ######################################################################################## +# +# Checking what happens when we try to set BINLOG_CACHE_SIZE to a value that is +# greater than MAX_BINLOG_CACHE_SIZE and vice-versa. In both cases, We expect +# that BINLOG_CACHE_SIZE will be set to MAX_BINLOG_CACHE_SIZE. (BUG#55377) +# +connection master; + +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 8192; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +SET @@GLOBAL.BINLOG_CACHE_SIZE= 16384; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 4096; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; + +--echo ######################################################################################## --echo # CLEAN --echo ######################################################################################## -connection master; DROP TABLE t1; DROP TABLE t2; DROP TABLE t3; === added file 'mysql-test/include/rpl_assert.inc' --- a/mysql-test/include/rpl_assert.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/rpl_assert.inc 2010-09-16 11:00:57 +0000 @@ -0,0 +1,118 @@ +# ==== Purpose ==== +# +# Check if a condition holds, fail with debug info if not. +# +# The condition is parsed before executed. The following constructs +# are supported: +# +# [SQL STATEMENT, COLUMN, ROW] +# The square bracket is replaced by the result from SQL STATEMENT, +# in the given COLUMN and ROW. +# +# <1> +# This is a shorthand for the result of the first executed square +# bracket. <2> is a shorthand for the second executed square +# bracket, and so on. +# +# ==== Usage ==== +# +# --let $assert_text= Relay_Log_Pos must be smaller than pos. +# --let $assert_cond= [SHOW SLAVE STATUS, Relay_Log_Pos, 1] >= $min_pos AND <1> <= $max_pos +# [--let $assert_quiet= 1] +# [--let $rpl_debug= 1] +# --source include/rpl_assert.inc +# +# Parameters: +# +# $assert_text +# Text that describes what is being checked. By default, this text +# is written to the query log. +# +# $assert_cond +# Condition to check. See above for details about the format. The +# condition will be executed as `SELECT $assert_cond`. Note: this +# condition is parsed using SQL statements, quoted inside single +# quotes, so it must not contain single quotes itself (use double +# quotes for strings). +# +# $assert_quiet +# Do not print $assert_text to the query log. +# +# $rpl_debug +# Print extra debug info. + + +if ($rpl_debug) +{ + --echo # debug: assert_text='$assert_text' assert_cond='$assert_cond' +} + +# Sanity-check input +if (`SELECT "$assert_text" = ""`) +{ + --die ERROR IN TEST: the mysqltest variable rpl_test must be set +} + +# Evaluate square brackets in cond. +--let $_rpl_assert_substmt_number= 1 +--let $_rpl_interpolated_cond= $assert_cond +--let $_rpl_assert_lbracket= `SELECT LOCATE('[', '$_rpl_interpolated_cond')` +while ($_rpl_assert_lbracket) +{ + # Get position of right bracket + --let $_rpl_assert_rbracket= `SELECT LOCATE(']', '$_rpl_interpolated_cond')` + if (!$_rpl_assert_rbracket) + { + --echo BUG IN TEST: Mismatching square brackets in assert_cond: '$assert_cond' + --die BUG IN TEST: Mismatching square brackets in $assert_cond + } + # Get sub-statement and result of it + --let $_rpl_assert_substmt= `SELECT SUBSTRING('$_rpl_interpolated_cond', $_rpl_assert_lbracket + 1, $_rpl_assert_rbracket - $_rpl_assert_lbracket - 1)` + --let $_rpl_assert_substmt_result= query_get_value($_rpl_assert_substmt) + if ($rpl_debug) + { + --echo # debug: sub-statement='$_rpl_assert_substmt' result='$rpl_assert_result' + } + # Replace sub-statement by its result + --let $_rpl_interpolated_cond= `SELECT REPLACE('$_rpl_interpolated_cond', '[$_rpl_assert_substmt]', '$_rpl_assert_substmt_result')` + # Replace result references by result + --let $_rpl_interpolated_cond= `SELECT REPLACE('$_rpl_interpolated_cond', '<$_rpl_assert_substmt_number>', '$_rpl_assert_substmt_result')` + + --let $_rpl_assert_lbracket= `SELECT LOCATE('[', '$_rpl_interpolated_cond')` + + --inc $_rpl_assert_substmt_number +} + +if ($rpl_debug) +{ + --echo # debug: interpolated_cond='$_rpl_interpolated_cond' +} + +# Execute. +--let $_rpl_assert_result= `SELECT $_rpl_interpolated_cond` + +if ($rpl_debug) +{ + --echo # debug: result='$_rpl_assert_result' +} + +# Check. +if (!$_rpl_assert_result) +{ + --echo ######## Test assertion failed: $assert_text ######## + --echo Dumping debug info: + --source include/show_rpl_debug_info.inc + --echo Assertion text: '$assert_text' + --echo Assertion condition: '$assert_cond' + --echo Assertion condition, interpolated: '$_rpl_interpolated_cond' + --echo Assertion result: '$_rpl_assert_result' + --die Test assertion failed in rpl_assertion.inc +} + +if (!$assert_quiet) +{ + --echo # Asserted this: $assert_text +} + +--let $assert_text= +--let $assert_cond= === modified file 'mysql-test/include/wait_for_slave_param.inc' --- a/mysql-test/include/wait_for_slave_param.inc 2010-05-26 14:34:25 +0000 +++ b/mysql-test/include/wait_for_slave_param.inc 2010-09-16 11:00:57 +0000 @@ -25,7 +25,7 @@ # # $slave_timeout # The default timeout is 5 minutes. You can change the timeout by -# setting $slave_timeout. The unit is tenths of seconds. +# setting $slave_timeout. The unit is seconds. # # $master_connection # If the timeout is reached, debug info is given by calling SHOW @@ -47,10 +47,12 @@ let $_slave_timeout_counter= $slave_timeout; if (!$_slave_timeout_counter) { - let $_slave_timeout_counter= 3000; + let $_slave_timeout_counter= 300; } # Save resulting counter for later use. let $slave_tcnt= $_slave_timeout_counter; +# Convert to deci-seconds +let $_slave_timeout_counter= `SELECT 10 * $_slave_timeout_counter`; let $_slave_param_comparison= $slave_param_comparison; if (`SELECT '$_slave_param_comparison' = ''`) @@ -72,7 +74,7 @@ while (`SELECT NOT('$_show_slave_status_ # This has to be outside the loop until BUG#41913 has been fixed if (!$_slave_timeout_counter) { - --echo **** ERROR: timeout after $slave_tcnt deci-seconds while waiting for slave parameter $slave_param $_slave_param_comparison $slave_param_value **** + --echo **** ERROR: timeout after $slave_tcnt seconds while waiting for slave parameter $slave_param $_slave_param_comparison $slave_param_value **** if (`SELECT '$slave_error_message' != ''`) { --echo Message: $slave_error_message @@ -80,5 +82,5 @@ if (!$_slave_timeout_counter) --echo Current connection is '$CURRENT_CONNECTION' echo Note: the following output may have changed since the failure was detected; source include/show_rpl_debug_info.inc; - die; + die timeout in wait_for_slave_param.inc; } === modified file 'mysql-test/r/variables.result' --- a/mysql-test/r/variables.result 2010-08-04 10:34:01 +0000 +++ b/mysql-test/r/variables.result 2010-09-20 12:12:36 +0000 @@ -1,5 +1,4 @@ drop table if exists t1,t2; -set @my_binlog_cache_size =@@global.binlog_cache_size; set @my_connect_timeout =@@global.connect_timeout; set @my_delayed_insert_timeout =@@global.delayed_insert_timeout; set @my_delayed_queue_size =@@global.delayed_queue_size; @@ -7,6 +6,7 @@ set @my_flush =@@glo set @my_flush_time =@@global.flush_time; set @my_key_buffer_size =@@global.key_buffer_size; set @my_max_binlog_cache_size =@@global.max_binlog_cache_size; +set @my_binlog_cache_size =@@global.binlog_cache_size; set @my_max_binlog_size =@@global.max_binlog_size; set @my_max_connect_errors =@@global.max_connect_errors; set @my_max_connections =@@global.max_connections; @@ -1035,7 +1035,6 @@ Warnings: Warning 1292 Truncated incorrect join_buffer_size value: '1' set @save_join_buffer_size=@@join_buffer_size; set join_buffer_size=@save_join_buffer_size; -set global binlog_cache_size =@my_binlog_cache_size; set global connect_timeout =@my_connect_timeout; set global delayed_insert_timeout =@my_delayed_insert_timeout; set global delayed_queue_size =@my_delayed_queue_size; @@ -1043,6 +1042,7 @@ set global flush =@m set global flush_time =@my_flush_time; set global key_buffer_size =@my_key_buffer_size; set global max_binlog_cache_size =@my_max_binlog_cache_size; +set global binlog_cache_size =@my_binlog_cache_size; set global max_binlog_size =@my_max_binlog_size; set global max_connect_errors =@my_max_connect_errors; set global max_connections =@my_max_connections; === added file 'mysql-test/suite/perfschema/r/checksum.result' --- a/mysql-test/suite/perfschema/r/checksum.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/r/checksum.result 2010-09-15 18:20:48 +0000 @@ -0,0 +1,34 @@ +checksum table performance_schema.COND_INSTANCES; +checksum table performance_schema.EVENTS_WAITS_CURRENT; +checksum table performance_schema.EVENTS_WAITS_HISTORY; +checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME; +checksum table performance_schema.FILE_INSTANCES; +checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME; +checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE; +checksum table performance_schema.MUTEX_INSTANCES; +checksum table performance_schema.PERFORMANCE_TIMERS; +checksum table performance_schema.RWLOCK_INSTANCES; +checksum table performance_schema.SETUP_CONSUMERS; +checksum table performance_schema.SETUP_INSTRUMENTS; +checksum table performance_schema.SETUP_TIMERS; +checksum table performance_schema.THREADS; +checksum table performance_schema.COND_INSTANCES extended; +checksum table performance_schema.EVENTS_WAITS_CURRENT extended; +checksum table performance_schema.EVENTS_WAITS_HISTORY extended; +checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME extended; +checksum table performance_schema.FILE_INSTANCES extended; +checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME extended; +checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE extended; +checksum table performance_schema.MUTEX_INSTANCES extended; +checksum table performance_schema.PERFORMANCE_TIMERS extended; +checksum table performance_schema.RWLOCK_INSTANCES extended; +checksum table performance_schema.SETUP_CONSUMERS extended; +checksum table performance_schema.SETUP_INSTRUMENTS extended; +checksum table performance_schema.SETUP_TIMERS extended; +checksum table performance_schema.THREADS extended; === modified file 'mysql-test/suite/perfschema/r/server_init.result' --- a/mysql-test/suite/perfschema/r/server_init.result 2010-08-20 08:48:59 +0000 +++ b/mysql-test/suite/perfschema/r/server_init.result 2010-09-17 16:43:02 +0000 @@ -112,18 +112,10 @@ where name like "wait/synch/mutex/sql/LO count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOG_INFO::lock"; -count(name) -1 -select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; -count(name) -1 -select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_event_metadata"; count(name) 1 @@ -140,15 +132,15 @@ where name like "wait/synch/mutex/sql/Cv count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_xid_cache"; +where name like "wait/synch/mutex/sql/LOCK_audit_mask"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_plugin"; +where name like "wait/synch/mutex/sql/LOCK_xid_cache"; count(name) 1 select count(name) from MUTEX_INSTANCES -where name like "wait/synch/mutex/sql/LOCK_gdl"; +where name like "wait/synch/mutex/sql/LOCK_plugin"; count(name) 1 select count(name) from MUTEX_INSTANCES @@ -204,10 +196,6 @@ where name like "wait/synch/cond/sql/Que count(name) 1 select count(name) from COND_INSTANCES -where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; -count(name) -1 -select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/COND_queue_state"; count(name) 1 === added file 'mysql-test/suite/perfschema/t/checksum.test' --- a/mysql-test/suite/perfschema/t/checksum.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/perfschema/t/checksum.test 2010-09-15 18:20:48 +0000 @@ -0,0 +1,64 @@ +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */ + +# Tests for PERFORMANCE_SCHEMA + +--source include/not_embedded.inc +--source include/have_perfschema.inc + +# +# The checksum value itself is random (data is volatile), +# just testing that this does not crash +# +--disable_result_log + +checksum table performance_schema.COND_INSTANCES; +checksum table performance_schema.EVENTS_WAITS_CURRENT; +checksum table performance_schema.EVENTS_WAITS_HISTORY; +checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME; +checksum table performance_schema.FILE_INSTANCES; +checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME; +checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE; +checksum table performance_schema.MUTEX_INSTANCES; +checksum table performance_schema.PERFORMANCE_TIMERS; +checksum table performance_schema.RWLOCK_INSTANCES; +checksum table performance_schema.SETUP_CONSUMERS; +checksum table performance_schema.SETUP_INSTRUMENTS; +checksum table performance_schema.SETUP_TIMERS; +checksum table performance_schema.THREADS; + +checksum table performance_schema.COND_INSTANCES extended; +checksum table performance_schema.EVENTS_WAITS_CURRENT extended; +checksum table performance_schema.EVENTS_WAITS_HISTORY extended; +checksum table performance_schema.EVENTS_WAITS_HISTORY_LONG extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_INSTANCE extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_BY_THREAD_BY_EVENT_NAME extended; +checksum table performance_schema.EVENTS_WAITS_SUMMARY_GLOBAL_BY_EVENT_NAME extended; +checksum table performance_schema.FILE_INSTANCES extended; +checksum table performance_schema.FILE_SUMMARY_BY_EVENT_NAME extended; +checksum table performance_schema.FILE_SUMMARY_BY_INSTANCE extended; +checksum table performance_schema.MUTEX_INSTANCES extended; +checksum table performance_schema.PERFORMANCE_TIMERS extended; +checksum table performance_schema.RWLOCK_INSTANCES extended; +checksum table performance_schema.SETUP_CONSUMERS extended; +checksum table performance_schema.SETUP_INSTRUMENTS extended; +checksum table performance_schema.SETUP_TIMERS extended; +checksum table performance_schema.THREADS extended; + +--enable_result_log + === modified file 'mysql-test/suite/perfschema/t/server_init.test' --- a/mysql-test/suite/perfschema/t/server_init.test 2010-08-20 08:48:59 +0000 +++ b/mysql-test/suite/perfschema/t/server_init.test 2010-09-17 16:43:02 +0000 @@ -43,10 +43,6 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/mysys/THR_LOCK_myisam"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/mysys/THR_LOCK_myisam_log"; - select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/mysys/THR_LOCK_heap"; @@ -83,11 +79,6 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_delayed_insert"; -# Named LOCK_uuid_short in 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_uuid_short"; - -# Named LOCK_uuid_generator in 5.5, LOCK_uuid_short in 6.0 select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_uuid_generator"; @@ -127,14 +118,16 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_server_started"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/LOG_INFO::lock"; +# LOG_INFO object are created on demand, and are not global. +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/LOG_INFO::lock"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Query_cache::structure_guard_mutex"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; +# The event scheduler may be disabled +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/Event_scheduler::LOCK_scheduler_state"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_event_metadata"; @@ -145,16 +138,11 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_user_locks"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_mdl"; - select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/Cversion_lock"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/LOCK_audit_mask"; +select count(name) from MUTEX_INSTANCES + where name like "wait/synch/mutex/sql/LOCK_audit_mask"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_xid_cache"; @@ -162,28 +150,13 @@ select count(name) from MUTEX_INSTANCES select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/LOCK_plugin"; -select count(name) from MUTEX_INSTANCES - where name like "wait/synch/mutex/sql/LOCK_gdl"; +# Not a global variable, may be destroyed already. +# select count(name) from MUTEX_INSTANCES +# where name like "wait/synch/mutex/sql/LOCK_gdl"; select count(name) from MUTEX_INSTANCES where name like "wait/synch/mutex/sql/tz_LOCK"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/slave_start"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_active"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from MUTEX_INSTANCES -# where name like "wait/synch/mutex/sql/BML_class::THR_LOCK_BML_get"; - # Verify that these global rwlocks have been properly initilized in sql select count(name) from RWLOCK_INSTANCES @@ -224,25 +197,10 @@ select count(name) from COND_INSTANCES select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/Query_cache::COND_cache_status_changed"; -select count(name) from COND_INSTANCES - where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; +# The event scheduler may be disabled +# select count(name) from COND_INSTANCES +# where name like "wait/synch/cond/sql/Event_scheduler::COND_state"; select count(name) from COND_INSTANCES where name like "wait/synch/cond/sql/COND_queue_state"; -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/COND_mdl"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML_registered"; - -# Does not exist in mysql 5.5, 6.0 only -# select count(name) from COND_INSTANCES -# where name like "wait/synch/cond/sql/BML_class::COND_BML_release"; - === modified file 'mysql-test/suite/rpl/r/rpl_delayed_slave.result' --- a/mysql-test/suite/rpl/r/rpl_delayed_slave.result 2010-06-21 12:32:29 +0000 +++ b/mysql-test/suite/rpl/r/rpl_delayed_slave.result 2010-09-16 11:00:57 +0000 @@ -7,145 +7,135 @@ start slave; call mtr.add_suppression("Unsafe statement written to the binary log using statement format"); call mtr.add_suppression("Unsafe statement written to the binary log using statement format"); [on master] -CREATE TABLE t1 (a VARCHAR(100), b INT AUTO_INCREMENT PRIMARY KEY); +CREATE TABLE t1 (a VARCHAR(100), b INT); +INSERT INTO t1 VALUES ("zero", 0); ==== Normal setup ==== [on slave] include/stop_slave.inc # CHANGE MASTER TO MASTER_DELAY = 2*T -# Checking that delay is what we set it to -# Expect status to be '' -SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST ORDER BY ID DESC LIMIT 1; -STATE - include/start_slave.inc +# Asserted this: SHOW SLAVE STATUS should return the same delay that we set with CHANGE MASTER [on master] -INSERT INTO t1(a) VALUES ('normal setup'); +INSERT INTO t1 VALUES ('normal setup', 1); [on slave] # sleep 1*T -# Expect query not executed and status is 'Waiting until MASTER_DELAY...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -Slave_SQL_Running_State='Waiting until MASTER_DELAY seconds after master executed event'; SQL_Remaining_Delay is greater than zero; SQL thread is behind IO thread +# Asserted this: Query 1 should not be executed +# Asserted this: Status should be 'Waiting until MASTER_DELAY...' # sleep 1*T # sync with master (with timeout 1*T) -# Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -normal setup 1 -Slave_SQL_Running_State='Slave has read all relay log; waiting for the slave I/O thread to update it'; SQL_Remaining_Delay is NULL; SQL thread is in sync with IO thread +# Asserted this: Query 1 should be executed +# Asserted this: Status should be 'Has read all relay log...' Checking that both slave threads are running. ==== Slave lags "naturally" after master ==== [on master] # CREATE FUNCTION delay_on_slave(time_units INT) RETURNS INT BEGIN IF @@server_id = 2 THEN RETURN SLEEP(time_units * T); ELSE RETURN 0; END IF; END -INSERT INTO t1(a) SELECT delay_on_slave(3); +INSERT INTO t1 SELECT delay_on_slave(3), 2; Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave. Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. -INSERT INTO t1(a) VALUES ('slave is already lagging: this statement should execute immediately'); -INSERT INTO t1(a) SELECT delay_on_slave(2); +INSERT INTO t1 VALUES ('slave is already lagging: this statement should execute immediately', 3); +INSERT INTO t1 SELECT delay_on_slave(2), 4; Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave. Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. [on slave] # sleep 1*T -# Expect no query executed and status is 'Waiting until MASTER_DELAY...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -normal setup 1 -Slave_SQL_Running_State='Waiting until MASTER_DELAY seconds after master executed event'; SQL_Remaining_Delay is greater than zero; SQL thread is behind IO thread +# Asserted this: No query executed +# Asserted this: Status should be 'Waiting until MASTER_DELAY...' # wait for first query to execute # sleep 1*T -# Expect second query executed and status is executing third query (i.e., 'User sleep') -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -slave is already lagging: this statement should execute immediately 3 -Slave_SQL_Running_State='User sleep'; SQL_Remaining_Delay is NULL; SQL thread is behind IO thread +# Asserted this: Second query executed +# Asserted this: Status should be executing third query (i.e., 'User sleep') # sleep 2*T -# Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -0 4 -Slave_SQL_Running_State='Slave has read all relay log; waiting for the slave I/O thread to update it'; SQL_Remaining_Delay is NULL; SQL thread is in sync with IO thread +# Asserted this: Third query executed +# Asserted this: Status should be 'Has read all relay log...' ==== Seconds_Behind_Master ==== # Bring slave to sync. include/stop_slave.inc CHANGE MASTER TO MASTER_DELAY = 0; include/start_slave.inc -INSERT INTO t1(a) VALUES ('Syncing slave'); +INSERT INTO t1 VALUES ('Syncing slave', 5); include/stop_slave.inc # CHANGE MASTER TO MASTER_DELAY = 2*T include/start_slave.inc -INSERT INTO t1(a) VALUES (delay_on_slave(1)); +INSERT INTO t1 VALUES (delay_on_slave(1), 6); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave. Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave. # sleep 1*T +# Asserted this: Seconds_Behind_Master should be between 0 and the 2*T # sleep 1*T -==== STOP SLAVE and START SLAVE ==== +# Asserted this: Seconds_Behind_Master should be at least 2*T +==== STOP SLAVE / START SLAVE + DML ==== include/stop_slave.inc # CHANGE MASTER TO MASTER_DELAY = 3*T include/start_slave.inc -# Checking that delay is what we set it to [on master] -INSERT INTO t1(a) VALUES ('stop slave and start slave'); +INSERT INTO t1 VALUES ('stop slave and start slave: DML', 7); [on slave] # sleep 1*T -SET @before_stop_slave= UNIX_TIMESTAMP(); include/stop_slave.inc -# STOP SLAVE finished in time. -# Expect query not executed and status is '' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -0 6 -Slave_SQL_Running_State=''; SQL_Remaining_Delay is NULL; SQL thread is behind IO thread +# Asserted this: STOP SLAVE should finish quickly, not wait for the ongoing sleep to finish +# Asserted this: SQL thread position should not increase after STOP SLAVE +# Asserted this: Query should not be executed after STOP SLAVE +# Asserted this: Status should be '' after STOP SLAVE include/start_slave.inc -# START SLAVE finished in time. +# Asserted this: START SLAVE should finish quickly [on slave] # sleep 1*T -# Expect query not executed and status is 'Waiting until MASTER_DELAY...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -0 6 -Slave_SQL_Running_State='Waiting until MASTER_DELAY seconds after master executed event'; SQL_Remaining_Delay is greater than zero; SQL thread is behind IO thread +# Asserted this: Query 7 should not be executed +# Asserted this: Status should be 'Waiting until MASTER_DELAY...' # sleep 1*T # sync with master (with timeout 1*T) -# Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -stop slave and start slave 7 -Slave_SQL_Running_State='Slave has read all relay log; waiting for the slave I/O thread to update it'; SQL_Remaining_Delay is NULL; SQL thread is in sync with IO thread +# Asserted this: Query 7 should be executed +# Asserted this: Status should be 'Has read all relay log...' +Checking that both slave threads are running. +==== STOP SLAVE / START SLAVE + DDL ==== +This verifies BUG#56442 +[on master] +CREATE TABLE t_check_dml_not_executed_prematurely (a INT); +[on slave] +# sleep 1*T +include/stop_slave.inc +# Asserted this: STOP SLAVE should finish quickly, not wait for the ongoing sleep to finish +# Asserted this: SQL thread position should not increase after STOP SLAVE +# Asserted this: Query should not be executed after STOP SLAVE +# Asserted this: Status should be '' after STOP SLAVE +include/start_slave.inc +# Asserted this: START SLAVE should finish quickly +# sleep 1*T +# Asserted this: DDL Query should not be executed after START SLAVE +# Asserted this: Status should be 'Waiting until MASTER_DELAY...' +# sleep 1*T +# sync with master (with timeout 1*T) +# Asserted this: DDL Query should be executed +# Asserted this: Status should be 'Has read all relay log...' Checking that both slave threads are running. ==== Change back to no delay ==== [on slave] include/stop_slave.inc CHANGE MASTER TO MASTER_DELAY = 0; -# Expect delay is 0. -SQL_Delay='0' +# Asserted this: Delay should be 0 when we set it to 0 include/start_slave.inc [on master] -INSERT INTO t1(a) VALUES ('change back to no delay'); +INSERT INTO t1 VALUES ('change back to no delay', 8); [on slave] # sleep 1*T -# Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; -a b -change back to no delay 8 -Slave_SQL_Running_State='Slave has read all relay log; waiting for the slave I/O thread to update it'; SQL_Remaining_Delay is NULL; SQL thread is in sync with IO thread +# Asserted this: Query should be executed +# Asserted this: Status should be 'Slave has read all relay log...' ==== Reset delay with RESET SLAVE ==== include/stop_slave.inc CHANGE MASTER TO MASTER_DELAY = 71; include/start_slave.inc -# Expect delay is 71 -SQL_Delay='71' +# Asserted this: Delay should be 71 when we set it to 71 include/stop_slave.inc RESET SLAVE; [on master] RESET MASTER; [on slave] include/start_slave.inc -# Expect delay is 0 -SQL_Delay='0' -==== Set a bad value for the delay ==== +# Asserted this: Delay should be 0 after RESET SLAVE +==== Set an invalid value for the delay ==== include/stop_slave.inc # Expect error for setting negative delay CHANGE MASTER TO MASTER_DELAY = -1; @@ -162,6 +152,6 @@ CHANGE MASTER TO MASTER_DELAY = 0; include/start_slave.inc ==== Clean up ==== [on master] -DROP TABLE t1; +DROP TABLE t1, t_check_dml_not_executed_prematurely; DROP FUNCTION delay_on_slave; [on slave] === modified file 'mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result' --- a/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result 2010-08-30 06:38:09 +0000 +++ b/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result 2010-09-17 11:32:06 +0000 @@ -5,6 +5,7 @@ reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Option binlog_cache_size "); CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MyIsam; CREATE TABLE t3(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; @@ -120,6 +121,34 @@ Got one of the listed errors COMMIT; source include/diff_master_slave.inc; ######################################################################################## +# CHECK MAX_BINLOG_CACHE_SIZE and BINLOG_CACHE_SIZE +######################################################################################## +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 8192; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +SET @@GLOBAL.BINLOG_CACHE_SIZE= 16384; +Warnings: +Warning 1709 Option binlog_cache_size (16384) is greater than max_binlog_cache_size (8192); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 8192 +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 4096; +Warnings: +Warning 1709 Option binlog_cache_size (8192) is greater than max_binlog_cache_size (4096); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 4096 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +######################################################################################## # CLEAN ######################################################################################## DROP TABLE t1; === modified file 'mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result' --- a/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result 2010-08-30 06:38:09 +0000 +++ b/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result 2010-09-17 11:32:06 +0000 @@ -5,6 +5,7 @@ reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Option binlog_cache_size "); CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MyIsam; CREATE TABLE t3(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; @@ -123,6 +124,34 @@ Got one of the listed errors COMMIT; source include/diff_master_slave.inc; ######################################################################################## +# CHECK MAX_BINLOG_CACHE_SIZE and BINLOG_CACHE_SIZE +######################################################################################## +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 8192; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +SET @@GLOBAL.BINLOG_CACHE_SIZE= 16384; +Warnings: +Warning 1709 Option binlog_cache_size (16384) is greater than max_binlog_cache_size (8192); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 8192 +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 4096; +Warnings: +Warning 1709 Option binlog_cache_size (8192) is greater than max_binlog_cache_size (4096); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 4096 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +######################################################################################## # CLEAN ######################################################################################## DROP TABLE t1; === modified file 'mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result' --- a/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result 2010-08-30 06:38:09 +0000 +++ b/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result 2010-09-17 11:32:06 +0000 @@ -5,6 +5,7 @@ reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Option binlog_cache_size "); CREATE TABLE t1(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; CREATE TABLE t2(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=MyIsam; CREATE TABLE t3(a INT PRIMARY KEY, data VARCHAR(30000)) ENGINE=Innodb; @@ -120,6 +121,34 @@ Got one of the listed errors COMMIT; source include/diff_master_slave.inc; ######################################################################################## +# CHECK MAX_BINLOG_CACHE_SIZE and BINLOG_CACHE_SIZE +######################################################################################## +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 8192; +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +SET @@GLOBAL.BINLOG_CACHE_SIZE= 16384; +Warnings: +Warning 1709 Option binlog_cache_size (16384) is greater than max_binlog_cache_size (8192); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 8192 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 8192 +SET @@GLOBAL.MAX_BINLOG_CACHE_SIZE= 4096; +Warnings: +Warning 1709 Option binlog_cache_size (8192) is greater than max_binlog_cache_size (4096); setting binlog_cache_size equal to max_binlog_cache_size. +SHOW VARIABLES LIKE 'MAX_BINLOG_CACHE_SIZE'; +Variable_name Value +max_binlog_cache_size 4096 +SHOW VARIABLES LIKE 'BINLOG_CACHE_SIZE'; +Variable_name Value +binlog_cache_size 4096 +######################################################################################## # CLEAN ######################################################################################## DROP TABLE t1; === modified file 'mysql-test/suite/rpl/t/rpl_delayed_slave.test' --- a/mysql-test/suite/rpl/t/rpl_delayed_slave.test 2010-09-04 00:24:29 +0000 +++ b/mysql-test/suite/rpl/t/rpl_delayed_slave.test 2010-09-16 11:00:57 +0000 @@ -6,7 +6,7 @@ # - Verify that slave has executed the events after but not before the # delay timeout. # -# - Verify that delay is correct works when slave is already lagging +# - Verify that delay is correct when slave is already lagging # due to slow queries. # # - Verify that Seconds_Behind_Master is greater than or equal to the @@ -44,6 +44,7 @@ # BUG#28760: Simulating a replication lag # [duplicate] BUG#22072: configurable delayed replication # [duplicate] BUG#21639: Add Replication Delay parameter +# BUG#56442: Slave executes delayed statements when STOP SLAVE is issued # # ==== Issues with this Test Case ==== # @@ -79,7 +80,8 @@ if (`SELECT '$max_query_execution_time' --echo [on master] -CREATE TABLE t1 (a VARCHAR(100), b INT AUTO_INCREMENT PRIMARY KEY); +CREATE TABLE t1 (a VARCHAR(100), b INT); +INSERT INTO t1 VALUES ("zero", 0); --echo ==== Normal setup ==== @@ -94,23 +96,17 @@ CREATE TABLE t1 (a VARCHAR(100), b INT A eval CHANGE MASTER TO MASTER_DELAY = $time2; --enable_query_log ---echo # Checking that delay is what we set it to ---let $delay= query_get_value(SHOW SLAVE STATUS, SQL_Delay, 1) -if (`SELECT $delay != $time2`) { - --echo Delay is wrong! Expected $time2, got $delay - --source include/show_rpl_debug_info.inc - --die wrong delay -} - ---echo # Expect status to be '' -SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST ORDER BY ID DESC LIMIT 1; - --source include/start_slave.inc +--let $assert_text= SHOW SLAVE STATUS should return the same delay that we set with CHANGE MASTER +--let $assert_cond= [SHOW SLAVE STATUS, SQL_Delay, 1] = $time2 +--source include/rpl_assert.inc + --echo [on master] --connection master -INSERT INTO t1(a) VALUES ('normal setup'); +INSERT INTO t1 VALUES ('normal setup', 1); +--let $query_number= 1 --source extra/rpl_tests/delayed_slave_wait_on_query.inc @@ -124,20 +120,24 @@ INSERT INTO t1(a) VALUES ('normal setup' --eval CREATE FUNCTION delay_on_slave(time_units INT) RETURNS INT BEGIN IF @@server_id = 2 THEN RETURN SLEEP(time_units * $time1); ELSE RETURN 0; END IF; END --enable_query_log -INSERT INTO t1(a) SELECT delay_on_slave(3); +INSERT INTO t1 SELECT delay_on_slave(3), 2; --save_master_pos -INSERT INTO t1(a) VALUES ('slave is already lagging: this statement should execute immediately'); -INSERT INTO t1(a) SELECT delay_on_slave(2); +INSERT INTO t1 VALUES ('slave is already lagging: this statement should execute immediately', 3); +INSERT INTO t1 SELECT delay_on_slave(2), 4; --echo [on slave] --source include/sync_slave_io_with_master.inc --echo # sleep 1*T --sleep $time1 ---echo # Expect no query executed and status is 'Waiting until MASTER_DELAY...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= No query executed +--let $assert_cond= MAX(b) = 1 FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Waiting until MASTER_DELAY...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Waiting until MASTER_DELAY%" +--source include/rpl_assert.inc --echo # wait for first query to execute --sync_with_master @@ -145,27 +145,35 @@ SELECT * FROM t1 ORDER BY b DESC LIMIT 1 --echo # sleep 1*T --sleep $time1 ---echo # Expect second query executed and status is executing third query (i.e., 'User sleep') -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= Second query executed +--let $assert_cond= MAX(b) = 3 FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be executing third query (i.e., 'User sleep') +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" = "User sleep" +--source include/rpl_assert.inc --echo # sleep 2*T --sleep $time2 ---echo # Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= Third query executed +--let $assert_cond= MAX(b) = 4 FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Has read all relay log...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Slave has read all relay log%" +--source include/rpl_assert.inc --echo ==== Seconds_Behind_Master ==== --echo # Bring slave to sync. --source include/stop_slave.inc -eval CHANGE MASTER TO MASTER_DELAY = 0; +CHANGE MASTER TO MASTER_DELAY = 0; --source include/start_slave.inc --connection master -INSERT INTO t1(a) VALUES ('Syncing slave'); +INSERT INTO t1 VALUES ('Syncing slave', 5); --sync_slave_with_master --source include/stop_slave.inc @@ -176,39 +184,28 @@ eval CHANGE MASTER TO MASTER_DELAY = $ti --source include/start_slave.inc --connection master -INSERT INTO t1(a) VALUES (delay_on_slave(1)); +INSERT INTO t1 VALUES (delay_on_slave(1), 6); --save_master_pos --connection slave --echo # sleep 1*T --sleep $time1 -let $bug_53167_is_fixed= 1; -if ($bug_53167_is_fixed) { - --let $seconds_behind_master= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) - # The value of Seconds_Behind_Master will be zero - # before the first non-FD event is executed. - if (`SELECT $seconds_behind_master < 0 OR $seconds_behind_master >= $time2`) { - --echo Seconds_Behind_Master was $seconds_behind_master. Expected that 0 =< Seconds_Behind_Master < SQL_Delay = $time2 - --source include/show_rpl_debug_info.inc - --die Seconds_Behind_Master was wrong - } -} +--let $assert_cond= [SHOW SLAVE STATUS, Seconds_Behind_Master, 1] >= 0 AND <1> < $time2 +--let $assert_text= Seconds_Behind_Master should be between 0 and the 2*T +--source include/rpl_assert.inc --echo # sleep 1*T --sleep $time1 ---let $seconds_behind_master= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) -if (`SELECT $seconds_behind_master < $time2`) { - --echo Seconds_Behind_Master was $seconds_behind_master. Expected it to be >= SQL_Delay = $time2 - --source include/show_rpl_debug_info.inc - --die Seconds_Behind_Master was < SQL_Delay -} +--let $assert_cond= [SHOW SLAVE STATUS, Seconds_Behind_Master, 1] >= $time2 +--let $assert_text= Seconds_Behind_Master should be at least 2*T +--source include/rpl_assert.inc --sync_with_master ---echo ==== STOP SLAVE and START SLAVE ==== +--echo ==== STOP SLAVE / START SLAVE + DML ==== # Set up a longer delay. --source include/stop_slave.inc @@ -220,71 +217,141 @@ eval CHANGE MASTER TO MASTER_DELAY = $ti --source include/start_slave.inc ---echo # Checking that delay is what we set it to ---let $delay= query_get_value(SHOW SLAVE STATUS, SQL_Delay, 1) -if (`SELECT $delay != $time3`) { - --echo Delay is wrong! Expected $time2, got $delay - --source include/show_rpl_debug_info.inc - --die wrong delay -} - --echo [on master] --connection master -INSERT INTO t1(a) VALUES ('stop slave and start slave'); +INSERT INTO t1 VALUES ('stop slave and start slave: DML', 7); --echo [on slave] --connection slave --echo # sleep 1*T --sleep $time1 -SET @before_stop_slave= UNIX_TIMESTAMP(); +--let $timestamp_before_stop= `SELECT UNIX_TIMESTAMP()` +--let $relay_log_pos_before_stop= query_get_value(SHOW SLAVE STATUS, Relay_Log_Pos, 1) --source include/stop_slave.inc -if (`SELECT UNIX_TIMESTAMP() - @before_stop_slave >= $time1`) -{ - --source include/show_rpl_debug_info.inc - --die STOP SLAVE did not finish in time -} ---echo # STOP SLAVE finished in time. ---echo # Expect query not executed and status is '' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= STOP SLAVE should finish quickly, not wait for the ongoing sleep to finish +--let $assert_cond= UNIX_TIMESTAMP() - $timestamp_before_stop < $time1 +--source include/rpl_assert.inc + +--let $assert_text= SQL thread position should not increase after STOP SLAVE +--let $assert_cond= [SHOW SLAVE STATUS, Relay_Log_Pos, 1] = $relay_log_pos_before_stop +--source include/rpl_assert.inc + +--let $assert_text= Query should not be executed after STOP SLAVE +--let $assert_cond= MAX(b) = 6 FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be '' after STOP SLAVE +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" = "" +--source include/rpl_assert.inc --source include/start_slave.inc -if (`SELECT UNIX_TIMESTAMP() - @before_stop_slave >= $time1`) -{ - --source include/show_rpl_debug_info.inc - --die START SLAVE did not finish in time -} ---echo # START SLAVE finished in time. +--let $assert_text= START SLAVE should finish quickly +--let $assert_cond= UNIX_TIMESTAMP() - $timestamp_before_stop < $time1 +--source include/rpl_assert.inc + +--let $query_number= 7 --source extra/rpl_tests/delayed_slave_wait_on_query.inc +--echo ==== STOP SLAVE / START SLAVE + DDL ==== + +--echo This verifies BUG#56442 + +--echo [on master] +--connection master +CREATE TABLE t_check_dml_not_executed_prematurely (a INT); +--source include/save_master_pos.inc + +--echo [on slave] +--connection slave +--echo # sleep 1*T +--sleep $time1 + +--let $timestamp_before_stop= `SELECT UNIX_TIMESTAMP()` +--let $relay_log_pos_before_stop= query_get_value(SHOW SLAVE STATUS, Relay_Log_Pos, 1) +--source include/stop_slave.inc + +--let $assert_text= STOP SLAVE should finish quickly, not wait for the ongoing sleep to finish +--let $assert_cond= UNIX_TIMESTAMP() - $timestamp_before_stop < $time1 +--source include/rpl_assert.inc + +--let $assert_text= SQL thread position should not increase after STOP SLAVE +--let $assert_cond= [SHOW SLAVE STATUS, Relay_Log_Pos, 1] = $relay_log_pos_before_stop +--source include/rpl_assert.inc + +--let $assert_text= Query should not be executed after STOP SLAVE +--let $assert_cond= COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = "t_check_dml_not_executed_prematurely" +--source include/rpl_assert.inc + +--let $assert_text= Status should be '' after STOP SLAVE +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" = "" +--source include/rpl_assert.inc + +--source include/start_slave.inc + +--let $assert_text= START SLAVE should finish quickly +--let $assert_cond= UNIX_TIMESTAMP() - $timestamp_before_stop < $time1 +--source include/rpl_assert.inc + +--echo # sleep 1*T +--sleep $time1 + +--let $assert_text= DDL Query should not be executed after START SLAVE +--let $assert_cond= COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = "t_check_dml_not_executed_prematurely" +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Waiting until MASTER_DELAY...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Waiting until MASTER_DELAY%" +--source include/rpl_assert.inc + +--echo # sleep 1*T +--sleep $time1 + +--echo # sync with master (with timeout 1*T) +--source include/sync_with_master.inc + +--let $assert_text= DDL Query should be executed +--let $assert_cond= COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = "t_check_dml_not_executed_prematurely" +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Has read all relay log...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" LIKE "Slave has read all relay log%" +--source include/rpl_assert.inc + +--source include/check_slave_is_running.inc + + --echo ==== Change back to no delay ==== --echo [on slave] --connection slave --source include/stop_slave.inc -eval CHANGE MASTER TO MASTER_DELAY = 0; +CHANGE MASTER TO MASTER_DELAY = 0; ---echo # Expect delay is 0. ---let $delay= query_get_value(SHOW SLAVE STATUS, SQL_Delay, 1) ---echo SQL_Delay='$delay' +--let $assert_text= Delay should be 0 when we set it to 0 +--let $assert_cond= [SHOW SLAVE STATUS, SQL_Delay, 1] = 0 +--source include/rpl_assert.inc --source include/start_slave.inc --echo [on master] --connection master -INSERT INTO t1(a) VALUES ('change back to no delay'); +INSERT INTO t1 VALUES ('change back to no delay', 8); --echo [on slave] --source include/sync_slave_io_with_master.inc --echo # sleep 1*T --sleep $time1 ---echo # Expect query executed and status is 'Has read all relay log...' -SELECT * FROM t1 ORDER BY b DESC LIMIT 1; ---source include/show_delayed_slave_state.inc +--let $assert_text= Query should be executed +--let $assert_cond= MAX(b) = 8 FROM t1 +--source include/rpl_assert.inc + +--let $assert_text= Status should be 'Slave has read all relay log...' +--let $assert_cond= "[SHOW SLAVE STATUS, Slave_SQL_Running_State, 1]" Like "Slave has read all relay log%" +--source include/rpl_assert.inc --echo ==== Reset delay with RESET SLAVE ==== @@ -293,9 +360,9 @@ SELECT * FROM t1 ORDER BY b DESC LIMIT 1 CHANGE MASTER TO MASTER_DELAY = 71; --source include/start_slave.inc ---echo # Expect delay is 71 ---let $delay= query_get_value(SHOW SLAVE STATUS, SQL_Delay, 1) ---echo SQL_Delay='$delay' +--let $assert_text= Delay should be 71 when we set it to 71 +--let $assert_cond= [SHOW SLAVE STATUS, SQL_Delay, 1] = 71 +--source include/rpl_assert.inc --source include/stop_slave.inc RESET SLAVE; @@ -306,12 +373,12 @@ RESET MASTER; --connection slave --source include/start_slave.inc ---echo # Expect delay is 0 ---let $delay= query_get_value(SHOW SLAVE STATUS, SQL_Delay, 1) ---echo SQL_Delay='$delay' +--let $assert_text= Delay should be 0 after RESET SLAVE +--let $assert_cond= [SHOW SLAVE STATUS, SQL_Delay, 1] = 0 +--source include/rpl_assert.inc ---echo ==== Set a bad value for the delay ==== +--echo ==== Set an invalid value for the delay ==== --source include/stop_slave.inc @@ -340,7 +407,7 @@ CHANGE MASTER TO MASTER_DELAY = 0; --echo [on master] --connection master -DROP TABLE t1; +DROP TABLE t1, t_check_dml_not_executed_prematurely; DROP FUNCTION delay_on_slave; --echo [on slave] === modified file 'mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size-master.opt' --- a/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size-master.opt 2009-11-03 19:02:56 +0000 +++ b/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size-master.opt 2010-09-06 16:21:15 +0000 @@ -1 +1 @@ ---binlog_cache_size=4096 --max_binlog_cache_size=7680 +--binlog_cache_size=15360 --max_binlog_cache_size=7680 --default-storage-engine=MyISAM === modified file 'mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size-master.opt' --- a/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size-master.opt 2010-06-17 20:51:35 +0000 +++ b/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size-master.opt 2010-09-06 16:21:15 +0000 @@ -1 +1 @@ ---binlog_cache_size=4096 --max_binlog_cache_size=7680 --default-storage-engine=MyISAM +--binlog_cache_size=15360 --max_binlog_cache_size=7680 --default-storage-engine=MyISAM === modified file 'mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size-master.opt' --- a/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size-master.opt 2009-11-03 19:02:56 +0000 +++ b/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size-master.opt 2010-09-06 16:21:15 +0000 @@ -1 +1 @@ ---binlog_cache_size=4096 --max_binlog_cache_size=7680 +--binlog_cache_size=15360 --max_binlog_cache_size=7680 --default-storage-engine=MyISAM === modified file 'mysql-test/suite/sys_vars/r/max_binlog_cache_size_basic.result' --- a/mysql-test/suite/sys_vars/r/max_binlog_cache_size_basic.result 2009-12-22 09:35:56 +0000 +++ b/mysql-test/suite/sys_vars/r/max_binlog_cache_size_basic.result 2010-09-20 12:12:36 +0000 @@ -1,17 +1,22 @@ -SET @start_value = @@global.max_binlog_cache_size; -SELECT @start_value; -@start_value +SET @start_max_binlog_cache_size = @@global.max_binlog_cache_size; +SELECT @start_max_binlog_cache_size; +@start_max_binlog_cache_size 18446744073709547520 +SET @start_binlog_cache_size = @@global.binlog_cache_size; +SELECT @start_binlog_cache_size; +@start_binlog_cache_size +32768 '#--------------------FN_DYNVARS_072_01------------------------#' SET @@global.max_binlog_cache_size = 5000; Warnings: Warning 1292 Truncated incorrect max_binlog_cache_size value: '5000' +Warning 1709 Option binlog_cache_size (32768) is greater than max_binlog_cache_size (4096); setting binlog_cache_size equal to max_binlog_cache_size. SET @@global.max_binlog_cache_size = DEFAULT; SELECT @@global.max_binlog_cache_size; @@global.max_binlog_cache_size 18446744073709547520 '#---------------------FN_DYNVARS_072_02-------------------------#' -SET @@global.max_binlog_cache_size = @start_value; +SET @@global.max_binlog_cache_size = @start_max_binlog_cache_size; SELECT @@global.max_binlog_cache_size = 4294967295; @@global.max_binlog_cache_size = 4294967295 0 @@ -146,7 +151,11 @@ SELECT global.max_binlog_cache_size; ERROR 42S02: Unknown table 'global' in field list SELECT max_binlog_cache_size = @@session.max_binlog_cache_size; ERROR 42S22: Unknown column 'max_binlog_cache_size' in 'field list' -SET @@global.max_binlog_cache_size = @start_value; +SET @@global.max_binlog_cache_size = @start_max_binlog_cache_size; SELECT @@global.max_binlog_cache_size; @@global.max_binlog_cache_size 18446744073709547520 +SET @@global.binlog_cache_size= @start_binlog_cache_size; +SELECT @@global.binlog_cache_size; +@@global.binlog_cache_size +32768 === modified file 'mysql-test/suite/sys_vars/t/max_binlog_cache_size_basic.test' --- a/mysql-test/suite/sys_vars/t/max_binlog_cache_size_basic.test 2009-12-22 09:35:56 +0000 +++ b/mysql-test/suite/sys_vars/t/max_binlog_cache_size_basic.test 2010-09-20 12:12:36 +0000 @@ -35,10 +35,14 @@ ######################################################################## # Saving initial value of max_binlog_cache_size in a temporary variable# +# We also save binlog_cache_size because its value cannot be greater # +# than max_binlog_cache_size. (BUG#55377) # ######################################################################## -SET @start_value = @@global.max_binlog_cache_size; -SELECT @start_value; +SET @start_max_binlog_cache_size = @@global.max_binlog_cache_size; +SELECT @start_max_binlog_cache_size; +SET @start_binlog_cache_size = @@global.binlog_cache_size; +SELECT @start_binlog_cache_size; --echo '#--------------------FN_DYNVARS_072_01------------------------#' @@ -56,7 +60,7 @@ SELECT @@global.max_binlog_cache_size; # Verify default value of variable # ############################################### -SET @@global.max_binlog_cache_size = @start_value; +SET @@global.max_binlog_cache_size = @start_max_binlog_cache_size; SELECT @@global.max_binlog_cache_size = 4294967295; --echo '#--------------------FN_DYNVARS_072_03------------------------#' @@ -174,8 +178,10 @@ SELECT max_binlog_cache_size = @@session # Restore initial value # ############################## -SET @@global.max_binlog_cache_size = @start_value; +SET @@global.max_binlog_cache_size = @start_max_binlog_cache_size; SELECT @@global.max_binlog_cache_size; +SET @@global.binlog_cache_size= @start_binlog_cache_size; +SELECT @@global.binlog_cache_size; ######################################################################## === modified file 'mysql-test/t/variables.test' --- a/mysql-test/t/variables.test 2010-07-27 15:01:56 +0000 +++ b/mysql-test/t/variables.test 2010-09-20 12:12:36 +0000 @@ -8,7 +8,6 @@ drop table if exists t1,t2; # # Bug#19263: variables.test doesn't clean up after itself (I/II -- save) # -set @my_binlog_cache_size =@@global.binlog_cache_size; set @my_connect_timeout =@@global.connect_timeout; set @my_delayed_insert_timeout =@@global.delayed_insert_timeout; set @my_delayed_queue_size =@@global.delayed_queue_size; @@ -16,6 +15,7 @@ set @my_flush =@@glo set @my_flush_time =@@global.flush_time; set @my_key_buffer_size =@@global.key_buffer_size; set @my_max_binlog_cache_size =@@global.max_binlog_cache_size; +set @my_binlog_cache_size =@@global.binlog_cache_size; set @my_max_binlog_size =@@global.max_binlog_size; set @my_max_connect_errors =@@global.max_connect_errors; set @my_max_connections =@@global.max_connections; @@ -806,7 +806,6 @@ set join_buffer_size=@save_join_buffer_s # Bug #19263: variables.test doesn't clean up after itself (II/II -- # restore) # -set global binlog_cache_size =@my_binlog_cache_size; set global connect_timeout =@my_connect_timeout; set global delayed_insert_timeout =@my_delayed_insert_timeout; set global delayed_queue_size =@my_delayed_queue_size; @@ -814,6 +813,7 @@ set global flush =@m set global flush_time =@my_flush_time; set global key_buffer_size =@my_key_buffer_size; set global max_binlog_cache_size =@my_max_binlog_cache_size; +set global binlog_cache_size =@my_binlog_cache_size; set global max_binlog_size =@my_max_binlog_size; set global max_connect_errors =@my_max_connect_errors; set global max_connections =@my_max_connections; === modified file 'mysql-test/valgrind.supp' --- a/mysql-test/valgrind.supp 2010-06-07 09:14:56 +0000 +++ b/mysql-test/valgrind.supp 2010-09-14 21:51:35 +0000 @@ -745,3 +745,28 @@ Memcheck:Addr1 fun:buf_buddy_relocate } + +# +# See related Bug#56666 +# Race condition between the server main thread and the kill server thread. +# +# Because of this race condition, the call to shutdown_performance_schema() +# was commented in sql/mysqld.cc, causing the reported leaks. +# + +{ + missing shutdown_performance_schema 1 + Memcheck:Leak + fun:malloc + fun:_Z10pfs_mallocmi +} + +{ + missing shutdown_performance_schema 2 + Memcheck:Leak + fun:malloc + fun:my_malloc + fun:_lf_alloc_new + fun:lf_hash_insert +} + === modified file 'packaging/WiX/mysql_server.wxs.in' --- a/packaging/WiX/mysql_server.wxs.in 2010-07-24 16:18:39 +0000 +++ b/packaging/WiX/mysql_server.wxs.in 2010-09-21 09:13:38 +0000 @@ -21,7 +21,9 @@ + + + max_binlog_cache_size) + { + if (thd) + { + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX, + ER(ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX), + (ulong) binlog_cache_size, + (ulong) max_binlog_cache_size); + } + else + { + sql_print_warning(ER_DEFAULT(ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX), + (ulong) binlog_cache_size, + (ulong) max_binlog_cache_size); + } + binlog_cache_size= max_binlog_cache_size; + } +} + /* Save position of binary log transaction cache. @@ -3542,11 +3568,8 @@ int MYSQL_BIN_LOG::wait_for_update_bin_l const struct timespec *timeout) { int ret= 0; - const char* old_msg = thd->proc_info; DBUG_ENTER("wait_for_update_bin_log"); - old_msg= thd->enter_cond(&update_cond, &LOCK_log, - "Master has sent all binlog to slave; " - "waiting for binlog to be updated"); + if (!timeout) mysql_cond_wait(&update_cond, &LOCK_log); else === modified file 'sql/binlog.h' --- a/sql/binlog.h 2010-08-26 14:29:22 +0000 +++ b/sql/binlog.h 2010-09-17 13:22:22 +0000 @@ -228,6 +228,7 @@ public: inline char* get_log_fname() { return log_file_name; } inline char* get_name() { return name; } inline mysql_mutex_t* get_log_lock() { return &LOCK_log; } + inline mysql_cond_t* get_log_cond() { return &update_cond; } inline IO_CACHE* get_log_file() { return &log_file; } inline void lock_index() { mysql_mutex_lock(&LOCK_index);} @@ -260,5 +261,6 @@ int check_binlog_magic(IO_CACHE* log, co bool purge_master_logs(THD* thd, const char* to_log); bool purge_master_logs_before_date(THD* thd, time_t purge_time); bool show_binlog_events(THD *thd, MYSQL_BIN_LOG *binary_log); +void check_binlog_cache_size(THD *thd); #endif /* BINLOG_H_INCLUDED */ === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2010-09-08 07:10:51 +0000 +++ b/sql/mysqld.cc 2010-09-17 11:32:06 +0000 @@ -1395,6 +1395,12 @@ static void mysqld_exit(int exit_code) mysql_audit_finalize(); clean_up_mutexes(); clean_up_error_log_mutex(); +#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE + /* + Bug#56666 needs to be fixed before calling: + shutdown_performance_schema(); + */ +#endif my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0); exit(exit_code); /* purecov: inspected */ } @@ -2729,6 +2735,11 @@ pthread_handler_t signal_hand(void *arg if (!abort_loop) { abort_loop=1; // mark abort for threads +#ifdef HAVE_PSI_INTERFACE + /* Delete the instrumentation for the signal thread */ + if (likely(PSI_server != NULL)) + PSI_server->delete_current_thread(); +#endif #ifdef USE_ONE_SIGNAL_HAND pthread_t tmp; if (mysql_thread_create(0, /* Not instrumented */ @@ -4663,6 +4674,8 @@ int mysqld_main(int argc, char **argv) if (opt_bootstrap) /* If running with bootstrap, do not start replication. */ opt_skip_slave_start= 1; + check_binlog_cache_size(NULL); + binlog_unsafe_map_init(); /* init_slave() must be called after the thread keys are created. @@ -4749,6 +4762,15 @@ int mysqld_main(int argc, char **argv) #endif #endif /* __WIN__ */ +#ifdef HAVE_PSI_INTERFACE + /* + Disable the main thread instrumentation, + to avoid recording events during the shutdown. + */ + if (PSI_server) + PSI_server->delete_current_thread(); +#endif + /* Wait until cleanup is done */ mysql_mutex_lock(&LOCK_thread_count); while (!ready_to_exit) @@ -4766,18 +4788,6 @@ int mysqld_main(int argc, char **argv) } #endif clean_up(1); -#ifdef HAVE_PSI_INTERFACE - /* - Disable the instrumentation, to avoid recording events - during the shutdown. - */ - if (PSI_server) - { - PSI_server->delete_current_thread(); - PSI_server= NULL; - } - shutdown_performance_schema(); -#endif mysqld_exit(0); } === modified file 'sql/rpl_master.cc' --- a/sql/rpl_master.cc 2010-07-29 11:30:51 +0000 +++ b/sql/rpl_master.cc 2010-09-17 12:31:54 +0000 @@ -511,6 +511,7 @@ void mysql_binlog_send(THD* thd, char* l const char *errmsg = "Unknown error"; NET* net = &thd->net; mysql_mutex_t *log_lock; + mysql_cond_t *log_cond; bool binlog_can_be_corrupted= FALSE; #ifndef DBUG_OFF int left_events = max_binlog_dump_events; @@ -654,7 +655,8 @@ impossible position"; mysql_bin_log, and it's already inited, and it will be destroyed only at shutdown). */ - log_lock = mysql_bin_log.get_log_lock(); + log_lock= mysql_bin_log.get_log_lock(); + log_cond= mysql_bin_log.get_log_cond(); if (pos > BIN_LOG_HEADER_SIZE) { /* reset transmit packet for the event read from binary log @@ -889,6 +891,7 @@ impossible position"; #ifndef DBUG_OFF ulong hb_info_counter= 0; #endif + const char* old_msg= thd->proc_info; signal_cnt= mysql_bin_log.signal_cnt; do { @@ -897,6 +900,9 @@ impossible position"; DBUG_ASSERT(heartbeat_ts && heartbeat_period != 0); set_timespec_nsec(*heartbeat_ts, heartbeat_period); } + thd->enter_cond(log_cond, log_lock, + "Master has sent all binlog to slave; " + "waiting for binlog to be updated"); ret= mysql_bin_log.wait_for_update_bin_log(thd, heartbeat_ts); DBUG_ASSERT(ret == 0 || (heartbeat_period != 0 && coord != NULL)); if (ret == ETIMEDOUT || ret == ETIME) @@ -912,12 +918,15 @@ impossible position"; #endif /* reset transmit packet for the heartbeat event */ if (reset_transmit_packet(thd, flags, &ev_offset, &errmsg)) + { + thd->exit_cond(old_msg); goto err; + } if (send_heartbeat_event(net, packet, coord)) { errmsg = "Failed on my_net_write()"; my_errno= ER_UNKNOWN_ERROR; - mysql_mutex_unlock(log_lock); + thd->exit_cond(old_msg); goto err; } } @@ -926,7 +935,7 @@ impossible position"; DBUG_PRINT("wait",("binary log received update or a broadcast signal caught")); } } while (signal_cnt == mysql_bin_log.signal_cnt && !thd->killed); - mysql_mutex_unlock(log_lock); + thd->exit_cond(old_msg); } break; === modified file 'sql/rpl_rli.cc' --- a/sql/rpl_rli.cc 2010-09-01 02:51:08 +0000 +++ b/sql/rpl_rli.cc 2010-09-17 11:32:06 +0000 @@ -45,9 +45,9 @@ Relay_log_info::Relay_log_info(bool is_s inited(0), abort_slave(0), slave_running(0), until_condition(UNTIL_NONE), until_log_pos(0), retried_trans(0), tables_to_lock(0), tables_to_lock_count(0), - last_event_start_time(0), + rows_query_ev(NULL), last_event_start_time(0), sql_delay(0), sql_delay_end(0), - m_flags(0), rows_query_ev(NULL) + m_flags(0) { DBUG_ENTER("Relay_log_info::Relay_log_info"); === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2010-09-04 00:24:29 +0000 +++ b/sql/rpl_slave.cc 2010-09-16 11:00:57 +0000 @@ -2244,6 +2244,26 @@ static int init_slave_thread(THD* thd, S } +/** + Sleep for the given amount of time. If the sleep is interrupted, + continue sleeping unless the THD has been killed. + + @param thd The THD object passed as first parameter to + (*thread_killed). + + @param sec The number of seconds to sleep. + + @param thread_killed Pointer to function that checks if the thread + has been killed or not. + + @param thread_killed_arg Pointer passed as second parameter to + (*thread_killed). + + @retval 0 If we slept the given number of seconds and THD was not + killed. + + @retval 1 If sleep was interrupted and THD killed. +*/ static int safe_sleep(THD* thd, int sec, CHECK_KILLED_FUNC thread_killed, void* thread_killed_arg) { @@ -2442,17 +2462,21 @@ static int has_temporary_error(THD *thd) /** If this is a lagging slave (specified with CHANGE MASTER TO MASTER_DELAY = X), delays accordingly. Also unlocks rli->data_lock. - Design note: this is the place to unlock rli->data_lock here since - it should be held when reading delay info from rli, but it should - not be held while sleeping. + Design note: this is the place to unlock rli->data_lock. The lock + must be held when reading delay info from rli, but it should not be + held while sleeping. @param ev Event that is about to be executed. @param thd The sql thread's THD object. @param rli The sql thread's Relay_log_info structure. + + @retval 0 If the delay timed out and the event shall be executed. + + @retval nonzero If the delay was interrupted and the event shall be skipped. */ -static void sql_delay_event(Log_event *ev, THD *thd, Relay_log_info *rli) +static int sql_delay_event(Log_event *ev, THD *thd, Relay_log_info *rli) { long sql_delay= rli->get_sql_delay(); @@ -2490,15 +2514,14 @@ static void sql_delay_event(Log_event *e nap_time)); rli->start_sql_delay(sql_delay_end); mysql_mutex_unlock(&rli->data_lock); - safe_sleep(thd, nap_time, (CHECK_KILLED_FUNC)sql_slave_killed, - (void*)rli); - DBUG_VOID_RETURN; + DBUG_RETURN(safe_sleep(thd, nap_time, + (CHECK_KILLED_FUNC)sql_slave_killed, (void*)rli)); } } mysql_mutex_unlock(&rli->data_lock); - DBUG_VOID_RETURN; + DBUG_RETURN(0); } @@ -2598,7 +2621,8 @@ int apply_event_and_update_pos(Log_event if (reason == Log_event::EVENT_SKIP_NOT) { // Sleeps if needed, and unlocks rli->data_lock. - sql_delay_event(ev, thd, rli); + if (sql_delay_event(ev, thd, rli)) + DBUG_RETURN(0); exec_res= ev->apply_event(rli); } else === modified file 'sql/share/errmsg-utf8.txt' --- a/sql/share/errmsg-utf8.txt 2010-09-09 10:58:40 +0000 +++ b/sql/share/errmsg-utf8.txt 2010-09-17 11:32:06 +0000 @@ -6389,3 +6389,6 @@ ER_ROW_DOES_NOT_MATCH_PARTITION swe "Hittade rad som inte passar i partitionen" ER_WARN_INDEX_NOT_APPLICABLE eng "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'" + +ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX + eng "Option binlog_cache_size (%lu) is greater than max_binlog_cache_size (%lu); setting binlog_cache_size equal to max_binlog_cache_size." === modified file 'sql/sql_binlog.cc' --- a/sql/sql_binlog.cc 2010-09-01 02:51:08 +0000 +++ b/sql/sql_binlog.cc 2010-09-21 11:32:50 +0000 @@ -147,7 +147,7 @@ void mysql_client_binlog_statement(THD* Allocation */ - int err; + int err= 0; Relay_log_info *rli; rli= thd->rli_fake; if (!rli && (rli= thd->rli_fake= new Relay_log_info(FALSE))) @@ -264,8 +264,6 @@ void mysql_client_binlog_statement(THD* */ #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) err= ev->apply_event(rli); -#else - err= 0; #endif /* Format_description_log_event should not be deleted because it === modified file 'sql/sql_plugin.cc' --- a/sql/sql_plugin.cc 2010-08-23 17:43:34 +0000 +++ b/sql/sql_plugin.cc 2010-09-21 21:27:43 +0000 @@ -519,7 +519,7 @@ static st_plugin_dl *plugin_dl_add(const /* no op */; cur= (struct st_mysql_plugin*) - my_malloc(i*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME)); + my_malloc((i+1)*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME)); if (!cur) { free_plugin_mem(&plugin_dl); === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-09-20 14:06:02 +0000 +++ b/sql/sql_select.cc 2010-09-22 11:37:38 +0000 @@ -1276,12 +1276,13 @@ bool might_do_join_buffering(uint join_c /* (1) sj_tab is not a const table */ - return (sj_tab-sj_tab->join->join_tab != sj_tab->join->const_tables && // (1) + int sj_tabno= sj_tab - sj_tab->join->join_tab; + return (sj_tabno >= (int)sj_tab->join->const_tables && // (1) sj_tab->use_quick != QS_DYNAMIC_RANGE && - ((join_cache_level != 0U && sj_tab->type == JT_ALL) || - (join_cache_level > 4U && + ((join_cache_level != 0 && sj_tab->type == JT_ALL) || + (join_cache_level > 4 && (sj_tab->type == JT_REF || - sj_tab->type == JT_EQ_REF || + sj_tab->type == JT_EQ_REF || sj_tab->type == JT_CONST)))); } @@ -4490,6 +4491,14 @@ make_join_statistics(JOIN *join, TABLE_L if (!stat || !stat_ref || !table_vector) DBUG_RETURN(1); // Eom /* purecov: inspected */ + if (!(join->positions= + new (join->thd->mem_root) POSITION[table_count+1])) + DBUG_RETURN(TRUE); + + if (!(join->best_positions= + new (join->thd->mem_root) POSITION[table_count+1])) + DBUG_RETURN(TRUE); + join->best_ref=stat_vector; stat_end=stat+table_count; === modified file 'sql/sql_select.h' --- a/sql/sql_select.h 2010-09-06 17:56:05 +0000 +++ b/sql/sql_select.h 2010-09-22 11:37:38 +0000 @@ -1369,7 +1369,7 @@ enum_nested_loop_state sub_select_sjm(JO advance_sj_state() for details. */ -typedef struct st_position +typedef struct st_position : public Sql_alloc { /* The "fanout" - number of output rows that will be produced (after @@ -1613,7 +1613,7 @@ public: */ ha_rows fetch_limit; /* Finally picked QEP. This is result of join optimization */ - POSITION best_positions[MAX_TABLES+1]; + POSITION *best_positions; /******* Join optimization state members start *******/ /* @@ -1623,7 +1623,7 @@ public: TABLE_LIST *emb_sjm_nest; /* Current join optimization state */ - POSITION positions[MAX_TABLES+1]; + POSITION *positions; /* Bitmap of nested joins embedding the position at the end of the current === modified file 'sql/sys_vars.cc' --- a/sql/sys_vars.cc 2010-09-01 13:13:01 +0000 +++ b/sql/sys_vars.cc 2010-09-17 11:32:06 +0000 @@ -235,6 +235,12 @@ static Sys_var_charptr Sys_basedir( READ_ONLY GLOBAL_VAR(mysql_home_ptr), CMD_LINE(REQUIRED_ARG, 'b'), IN_FS_CHARSET, DEFAULT(0)); +static bool fix_binlog_cache_size(sys_var *self, THD *thd, enum_var_type type) +{ + check_binlog_cache_size(thd); + return false; +} + static Sys_var_ulong Sys_binlog_cache_size( "binlog_cache_size", "The size of the cache to " "hold the SQL statements for the binary log during a " @@ -242,7 +248,9 @@ static Sys_var_ulong Sys_binlog_cache_si "transactions you can increase this to get more performance", GLOBAL_VAR(binlog_cache_size), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(IO_SIZE, ULONG_MAX), DEFAULT(32768), BLOCK_SIZE(IO_SIZE)); + VALID_RANGE(IO_SIZE, ULONG_MAX), DEFAULT(32768), BLOCK_SIZE(IO_SIZE), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), + ON_UPDATE(fix_binlog_cache_size)); static bool check_has_super(sys_var *self, THD *thd, set_var *var) { @@ -1055,7 +1063,9 @@ static Sys_var_ulonglong Sys_max_binlog_ GLOBAL_VAR(max_binlog_cache_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(IO_SIZE, ULONGLONG_MAX), DEFAULT((ULONGLONG_MAX/IO_SIZE)*IO_SIZE), - BLOCK_SIZE(IO_SIZE)); + BLOCK_SIZE(IO_SIZE), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), + ON_UPDATE(fix_binlog_cache_size)); static bool fix_max_binlog_size(sys_var *self, THD *thd, enum_var_type type) { === modified file 'storage/perfschema/pfs_engine_table.cc' --- a/storage/perfschema/pfs_engine_table.cc 2010-08-12 15:25:01 +0000 +++ b/storage/perfschema/pfs_engine_table.cc 2010-09-20 20:59:48 +0000 @@ -223,6 +223,8 @@ int PFS_engine_table::read_row(TABLE *ta Field **fields) { my_bitmap_map *org_bitmap; + Field *f; + Field **fields_reset; /* Make sure the table structure is as expected before mapping @@ -240,6 +242,16 @@ int PFS_engine_table::read_row(TABLE *ta /* We internally write to Fields to support the read interface */ org_bitmap= dbug_tmp_use_all_columns(table, table->write_set); + + /* + Some callers of the storage engine interface do not honor the + f->is_null() flag, and will attempt to read the data itself. + A known offender is mysql_checksum_table(). + For robustness, reset every field. + */ + for (fields_reset= fields; (f= *fields_reset) ; fields_reset++) + f->reset(); + int result= read_row_values(table, buf, fields, read_all); dbug_tmp_restore_column_map(table->write_set, org_bitmap); === modified file 'storage/perfschema/table_events_waits.cc' --- a/storage/perfschema/table_events_waits.cc 2010-08-12 10:21:22 +0000 +++ b/storage/perfschema/table_events_waits.cc 2010-09-15 20:46:26 +0000 @@ -187,7 +187,7 @@ void table_events_waits_common::clear_ob */ void table_events_waits_common::make_row(bool thread_own_wait, PFS_thread *pfs_thread, - PFS_events_waits *wait) + volatile PFS_events_waits *wait) { pfs_lock lock; PFS_thread *safe_thread; @@ -260,21 +260,27 @@ void table_events_waits_common::make_row m_row.m_object_type= "TEMPORARY TABLE"; m_row.m_object_type_length= 15; } - memcpy(m_row.m_object_schema, wait->m_schema_name, - wait->m_schema_name_length); m_row.m_object_schema_length= wait->m_schema_name_length; - memcpy(m_row.m_object_name, wait->m_object_name, - wait->m_object_name_length); + if (unlikely((m_row.m_object_schema_length == 0) || + (m_row.m_object_schema_length > sizeof(m_row.m_object_schema)))) + return; + memcpy(m_row.m_object_schema, wait->m_schema_name, m_row.m_object_schema_length); m_row.m_object_name_length= wait->m_object_name_length; + if (unlikely((m_row.m_object_name_length == 0) || + (m_row.m_object_name_length > sizeof(m_row.m_object_name)))) + return; + memcpy(m_row.m_object_name, wait->m_object_name, m_row.m_object_name_length); safe_class= &global_table_class; break; case WAIT_CLASS_FILE: m_row.m_object_type= "FILE"; m_row.m_object_type_length= 4; m_row.m_object_schema_length= 0; - memcpy(m_row.m_object_name, wait->m_object_name, - wait->m_object_name_length); m_row.m_object_name_length= wait->m_object_name_length; + if (unlikely((m_row.m_object_name_length == 0) || + (m_row.m_object_name_length > sizeof(m_row.m_object_name)))) + return; + memcpy(m_row.m_object_name, wait->m_object_name, m_row.m_object_name_length); safe_class= sanitize_file_class((PFS_file_class*) wait->m_class); break; case NO_WAIT_CLASS: === modified file 'storage/perfschema/table_events_waits.h' --- a/storage/perfschema/table_events_waits.h 2010-07-23 17:08:41 +0000 +++ b/storage/perfschema/table_events_waits.h 2010-09-15 20:46:26 +0000 @@ -139,7 +139,7 @@ protected: void clear_object_columns(); void make_row(bool thread_own_wait, PFS_thread *pfs_thread, - PFS_events_waits *wait); + volatile PFS_events_waits *wait); /** Current row. */ row_events_waits m_row; === modified file 'strings/my_vsnprintf.c' --- a/strings/my_vsnprintf.c 2009-12-28 12:54:16 +0000 +++ b/strings/my_vsnprintf.c 2010-09-15 11:33:22 +0000 @@ -255,7 +255,7 @@ static char *process_int_arg(char *to, c if ((to_length= (size_t) (end-to)) < 16 || length) store_start= buff; - if (arg_type == 'd') + if (arg_type == 'd' || arg_type == 'i') store_end= longlong10_to_str(par, store_start, -10); else if (arg_type == 'u') store_end= longlong10_to_str(par, store_start, 10); @@ -399,6 +399,7 @@ start: args_arr[i].double_arg= va_arg(ap, double); break; case 'd': + case 'i': case 'u': case 'x': case 'X': @@ -406,7 +407,7 @@ start: case 'p': if (args_arr[i].have_longlong) args_arr[i].longlong_arg= va_arg(ap,longlong); - else if (args_arr[i].arg_type == 'd') + else if (args_arr[i].arg_type == 'd' || args_arr[i].arg_type == 'i') args_arr[i].longlong_arg= va_arg(ap, int); else args_arr[i].longlong_arg= va_arg(ap, uint); @@ -458,6 +459,7 @@ start: break; } case 'd': + case 'i': case 'u': case 'x': case 'X': @@ -472,7 +474,7 @@ start: if (args_arr[print_arr[i].arg_idx].have_longlong) larg = args_arr[print_arr[i].arg_idx].longlong_arg; - else if (print_arr[i].arg_type == 'd') + else if (print_arr[i].arg_type == 'd' || print_arr[i].arg_type == 'i' ) larg = (int) args_arr[print_arr[i].arg_idx].longlong_arg; else larg= (uint) args_arr[print_arr[i].arg_idx].longlong_arg; @@ -615,8 +617,8 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, to= process_dbl_arg(to, end, width, d, *fmt); continue; } - else if (*fmt == 'd' || *fmt == 'u' || *fmt == 'x' || *fmt == 'X' || - *fmt == 'p' || *fmt == 'o') + else if (*fmt == 'd' || *fmt == 'i' || *fmt == 'u' || *fmt == 'x' || + *fmt == 'X' || *fmt == 'p' || *fmt == 'o') { /* Integer parameter */ longlong larg; @@ -625,7 +627,7 @@ size_t my_vsnprintf_ex(CHARSET_INFO *cs, if (have_longlong) larg = va_arg(ap,longlong); - else if (*fmt == 'd') + else if (*fmt == 'd' || *fmt == 'i') larg = va_arg(ap, int); else larg= va_arg(ap, uint); === modified file 'unittest/mysys/my_vsnprintf-t.c' --- a/unittest/mysys/my_vsnprintf-t.c 2009-12-28 12:54:16 +0000 +++ b/unittest/mysys/my_vsnprintf-t.c 2010-09-15 11:33:22 +0000 @@ -31,7 +31,7 @@ void test1(const char *res, const char * int main(void) { - plan(54); + plan(58); test1("Constant string", "Constant string"); @@ -44,6 +44,8 @@ int main(void) "Format specifier c %c", '!'); test1("Format specifier d 1", "Format specifier d %d", 1); + test1("Format specifier i 1", + "Format specifier i %i", 1); test1("Format specifier u 2", "Format specifier u %u", 2); test1("Format specifier o 375", @@ -77,6 +79,9 @@ int main(void) test1("Length modifiers work: 1 * -1 * 2 * 3", "Length modifiers work: %d * %ld * %lld * %zd", 1, -1L, 2LL, (size_t)3); + test1("Length modifiers work: 1 * -1 * 2 * 3", + "Length modifiers work: %i * %li * %lli * %zd", 1, -1L, 2LL, (size_t)3); + test1("long long X: 123456789abcdef0", "long long X: %llx", 0x123456789abcdef0LL); @@ -121,6 +126,10 @@ int main(void) "Hello int, %d", 1); test1("Hello int, -1", "Hello int, %d", -1); + test1("Hello int, 1", + "Hello int, %i", 1); + test1("Hello int, -1", + "Hello int, %i", -1); test1("Hello string 'I am a string'", "Hello string '%s'", "I am a string"); test1("Hello hack hack hack hack hack hack hack 1", --===============4935919092639462246== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped\ # ykikhmuzvvatvohy # target_branch: file:///export/home/didrik/repo/next-mr-opt-team-\ # merge-from-bp/ # testament_sha1: e76e26dff53a22f178051c951003bfef2d3386b1 # timestamp: 2010-09-23 10:51:47 +0200 # source_branch: file:///export/home/didrik/repo/next-mr-opt-\ # backporting-merge/ # base_revision_id: tor.didriksen@stripped\ # vfolgmbog9tsr5wz # # Begin bundle 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 3r9B9kJT/iAe2gGAEYZLP/4u5IpwoSB/D9TO --===============4935919092639462246==--