From 99f8d0a4a82b6816345fabf5b9570435b80930a0 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Sep 2006 15:24:45 +0300 Subject: [PATCH] binlog_row_binlog test gained some indeterministic checks with changes due to ChangeSet@1.2309.1.12, 2006-09-12 15:42:13+02:00, guilhem@gbichot3.local +14 -0 Fixing problems I identified in my auto_increment work pushed in July (as part of the auto_increment cleanup of WL #3146; ... The problem is in that show binlog events in indeterministic, row events can be compressed, so that 2 seconds original delay does not guard from inconsistency. We syncronize test's current inserted rows counter with system insert delayed thread per each query. From another side there is no requirement for binlog to be event per row and then to verify if binlog has recorded what was recently inserted is better via reading from it instead of 'show binlog events'. mysql-test/extra/binlog_tests/binlog_insert_delayed.test: removing sleeps, syncronizing with system delayed thread per each statement, note that an insert statement is performed atomically including writing to binlog, so that concurrent selects are waiting. That's why the wait macro is safe. mysql-test/r/binlog_row_binlog.result: new result mysql-test/include/wait_until_rows_count.inc: macro implements waiting until a targeted table has a prescribed rows number. --- .../binlog_tests/binlog_insert_delayed.test | 32 ++++++++---- mysql-test/include/wait_until_rows_count.inc | 52 +++++++++++++++++++ mysql-test/r/binlog_row_binlog.result | 1 + 3 files changed, 74 insertions(+), 11 deletions(-) create mode 100644 mysql-test/include/wait_until_rows_count.inc diff --git a/mysql-test/extra/binlog_tests/binlog_insert_delayed.test b/mysql-test/extra/binlog_tests/binlog_insert_delayed.test index 6f504fded96..29c2c477960 100644 --- a/mysql-test/extra/binlog_tests/binlog_insert_delayed.test +++ b/mysql-test/extra/binlog_tests/binlog_insert_delayed.test @@ -4,23 +4,33 @@ create table t1 (a int not null auto_increment, primary key (a)) engine=myisam; set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1; # Verify that only one INSERT_ID event is binlogged. # Note, that because of WL#3368 mixed mode binlog records RBR events for the delayed +let $table=t1; +let $rows_inserted=11; # total number of inserted rows in this test insert delayed into t1 values (207); +let $count=1; -# We use sleeps between statements, that's the only way to get a -# repeatable binlog in a normal test run and under Valgrind. The -# reason is that without sleeps, rows of different INSERT DELAYEDs -# sometimes group together and sometimes not, so the table may be -# unlocked/relocked causing a different number of table map log -# events. -sleep 2; +# use this macro instead of sleeps. + +--source include/wait_until_rows_count.inc insert delayed into t1 values (null); -sleep 2; +inc $count; +--source include/wait_until_rows_count.inc + insert delayed into t1 values (300); -sleep 2; # time for the delayed queries to reach disk +inc $count; +--source include/wait_until_rows_count.inc + insert delayed into t1 values (null),(null),(null),(null); -sleep 2; +inc $count; inc $count; inc $count; inc $count; +--source include/wait_until_rows_count.inc + insert delayed into t1 values (null),(null),(400),(null); -sleep 2; +inc $count; inc $count; inc $count; inc $count; +--source include/wait_until_rows_count.inc + +#check this assertion about $count calculation +--echo $count == $rows_inserted + select * from t1; --replace_column 2 # 5 # --replace_regex /table_id: [0-9]+/table_id: #/ diff --git a/mysql-test/include/wait_until_rows_count.inc b/mysql-test/include/wait_until_rows_count.inc new file mode 100644 index 00000000000..cf2a21d335a --- /dev/null +++ b/mysql-test/include/wait_until_rows_count.inc @@ -0,0 +1,52 @@ +# include/wait_until_rows_count.inc +# inspired by wait_for_slave_status by Matthias Leich +# +# SUMMARY +# +# Waits until SELECT count(*)-$count from $table returns zero +# +# USAGE +# +# Set vars like +# let $count=11; +# let $table=t1; +# # invoke the macro +# --include wait_until_rows_count.inc +# +# EXAMPLE +# extra/binlog/binlog_insert_delayed.test +# +# +# TODO: generalize up to wait_[until|while] with arbitrary select or even query and +# a condition to wait or get awakened +# It's impossible to implement such a "most" general macro without +# extending mysqltest. Just no way to pass a query as an argument and +# evaluate it here, like eval "$quuery". One is bound +# to specify it inside of the macro + +--disable_query_log + +let $wait_counter= 300; # max wait in 0.1 seconds +while ($wait_counter) +{ + eval select count(*)-$count from $table into @rez; + let $rez=`select @rez`; + let $success=`SELECT @rez = 0`; + let $no_success=1; + if ($success) + { + let $wait_counter= 1; # droppping counter to leave loop + let $no_success=0; + } + if ($no_success) + { + --sleep 0.1 + } + dec $wait_counter; +} + +--enable_query_log +if ($no_success) +{ + --die Timeout in wait_until_rows_count.inc, required table never had a prescribed number of rows. +} diff --git a/mysql-test/r/binlog_row_binlog.result b/mysql-test/r/binlog_row_binlog.result index 8d5025f7602..5eef5d9cbf3 100644 --- a/mysql-test/r/binlog_row_binlog.result +++ b/mysql-test/r/binlog_row_binlog.result @@ -252,6 +252,7 @@ insert delayed into t1 values (null); insert delayed into t1 values (300); insert delayed into t1 values (null),(null),(null),(null); insert delayed into t1 values (null),(null),(400),(null); +11 == 11 select * from t1; a 207