2016-12-05 19:19:01 +01:00
#
# This include file is used by more than one test suite
# (currently rpl and binlog_encryption).
# Please check all dependent tests after modifying it
#
-- source include / have_innodb . inc
-- source include / master - slave . inc
-- disable_warnings
2017-02-08 21:28:00 +01:00
call mtr . add_suppression ( " Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. .*Statement: insert into t2 set data=repeat.*'a', @act_size.* " );
call mtr . add_suppression ( " Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. .*Statement: insert into t1 values.* NAME_CONST.*'n',.*, @data .* " );
2016-12-05 19:19:01 +01:00
-- enable_warnings
connection master ;
set @ save_binlog_cache_size = @@ global . binlog_cache_size ;
set @ save_binlog_checksum = @@ global . binlog_checksum ;
set @ save_master_verify_checksum = @@ global . master_verify_checksum ;
set @@ global . binlog_cache_size = 4096 ;
set @@ global . binlog_checksum = CRC32 ;
set @@ global . master_verify_checksum = 1 ;
# restart slave to force the dump thread to verify events (on master side)
connection slave ;
source include / stop_slave . inc ;
source include / start_slave . inc ;
connection master ;
#
# Testing a critical part of checksum handling dealing with transaction cache.
# The cache's buffer size is set to be less than the transaction's footprint
# in binlog.
#
# To verify combined buffer-by-buffer read out of the file and fixing crc per event
# there are the following parts:
#
# 1. the event size is much less than the cache's buffer
# 2. the event size is bigger than the cache's buffer
# 3. the event size if approximately the same as the cache's buffer
# 4. all in above
#
# 1. the event size is much less than the cache's buffer
#
flush status ;
show status like " binlog_cache_use " ;
show status like " binlog_cache_disk_use " ;
-- disable_warnings
drop table if exists t1 ;
-- enable_warnings
#
# parameter to ensure the test slightly varies binlog content
# between different invocations
#
let $deviation_size = 32 ;
eval create table t1 ( a int PRIMARY KEY , b CHAR ( $deviation_size )) engine = innodb ;
# Now we are going to create transaction which is long enough so its
# transaction binlog will be flushed to disk...
delimiter | ;
create procedure test . p_init ( n int , size int )
begin
while n > 0 do
select round ( RAND () * size ) into @ act_size ;
set @ data = repeat ( 'a' , @ act_size );
insert into t1 values ( n , @ data );
set n = n - 1 ;
end while ;
end |
delimiter ; |
let $ 1 = 4000 ; # PB2 can run it slow to time out on following sync_slave_with_master:s
begin ;
-- disable_warnings
# todo: check if it is really so.
#+Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a system function whose value may differ on slave.
eval call test . p_init ( $ 1 , $deviation_size );
-- enable_warnings
commit ;
show status like " binlog_cache_use " ;
-- echo *** binlog_cache_disk_use must be non - zero ***
show status like " binlog_cache_disk_use " ;
sync_slave_with_master ;
let $diff_tables = master : test . t1 , slave : test . t1 ;
source include / diff_tables . inc ;
# undoing changes with verifying the above once again
connection master ;
begin ;
delete from t1 ;
commit ;
sync_slave_with_master ;
#
# 2. the event size is bigger than the cache's buffer
#
connection master ;
flush status ;
let $t2_data_size = `select 3 * @@global.binlog_cache_size` ;
let $t2_aver_size = `select 2 * @@global.binlog_cache_size` ;
let $t2_max_rand = `select 1 * @@global.binlog_cache_size` ;
eval create table t2 ( a int auto_increment primary key , data VARCHAR ( $t2_data_size )) ENGINE = Innodb ;
let $ 1 = 100 ;
-- disable_query_log
begin ;
while ( $ 1 )
{
eval select round ( $t2_aver_size + RAND () * $t2_max_rand ) into @ act_size ;
set @ data = repeat ( 'a' , @ act_size );
insert into t2 set data = @ data ;
dec $ 1 ;
}
commit ;
-- enable_query_log
show status like " binlog_cache_use " ;
-- echo *** binlog_cache_disk_use must be non - zero ***
show status like " binlog_cache_disk_use " ;
sync_slave_with_master ;
let $diff_tables = master : test . t2 , slave : test . t2 ;
source include / diff_tables . inc ;
# undoing changes with verifying the above once again
connection master ;
begin ;
delete from t2 ;
commit ;
sync_slave_with_master ;
#
# 3. the event size if approximately the same as the cache's buffer
#
connection master ;
flush status ;
let $t3_data_size = `select 2 * @@global.binlog_cache_size` ;
let $t3_aver_size = `select (9 * @@global.binlog_cache_size) / 10` ;
let $t3_max_rand = `select (2 * @@global.binlog_cache_size) / 10` ;
eval create table t3 ( a int auto_increment primary key , data VARCHAR ( $t3_data_size )) engine = innodb ;
let $ 1 = 300 ;
-- disable_query_log
begin ;
while ( $ 1 )
{
eval select round ( $t3_aver_size + RAND () * $t3_max_rand ) into @ act_size ;
insert into t3 set data = repeat ( 'a' , @ act_size );
dec $ 1 ;
}
commit ;
-- enable_query_log
show status like " binlog_cache_use " ;
-- echo *** binlog_cache_disk_use must be non - zero ***
show status like " binlog_cache_disk_use " ;
sync_slave_with_master ;
let $diff_tables = master : test . t3 , slave : test . t3 ;
source include / diff_tables . inc ;
# undoing changes with verifying the above once again
connection master ;
begin ;
delete from t3 ;
commit ;
sync_slave_with_master ;
#
# 4. all in above
#
connection master ;
flush status ;
delimiter | ;
eval create procedure test . p1 ( n int )
begin
while n > 0 do
case ( select ( round ( rand () * 100 ) % 3 ) + 1 )
when 1 then
select round ( RAND () * $deviation_size ) into @ act_size ;
set @ data = repeat ( 'a' , @ act_size );
insert into t1 values ( n , @ data );
when 2 then
begin
select round ( $t2_aver_size + RAND () * $t2_max_rand ) into @ act_size ;
insert into t2 set data = repeat ( 'a' , @ act_size );
end ;
when 3 then
begin
select round ( $t3_aver_size + RAND () * $t3_max_rand ) into @ act_size ;
insert into t3 set data = repeat ( 'a' , @ act_size );
end ;
end case ;
set n = n - 1 ;
end while ;
end |
delimiter ; |
let $ 1 = 1000 ;
set autocommit = 0 ;
begin ;
-- disable_warnings
eval call test . p1 ( $ 1 );
-- enable_warnings
commit ;
show status like " binlog_cache_use " ;
-- echo *** binlog_cache_disk_use must be non - zero ***
show status like " binlog_cache_disk_use " ;
sync_slave_with_master ;
let $diff_tables = master : test . t1 , slave : test . t1 ;
source include / diff_tables . inc ;
let $diff_tables = master : test . t2 , slave : test . t2 ;
source include / diff_tables . inc ;
let $diff_tables = master : test . t3 , slave : test . t3 ;
source include / diff_tables . inc ;
connection master ;
begin ;
delete from t1 ;
delete from t2 ;
delete from t3 ;
commit ;
drop table t1 , t2 , t3 ;
set @@ global . binlog_cache_size = @ save_binlog_cache_size ;
set @@ global . binlog_checksum = @ save_binlog_checksum ;
set @@ global . master_verify_checksum = @ save_master_verify_checksum ;
drop procedure test . p_init ;
drop procedure test . p1 ;
-- source include / rpl_end . inc