mariadb/mysql-test/t/rpl_relayrotate.test
unknown a58b351eeb WL#775 "Add status variable identifying binlog_cache_size shortage"
Added two status variables: 
  binlog_cache_use - counts number of transactions that used somehow
    transaction temporary binary log.
  binlog_cache_disk_use - counts number of transactions that required
    disk I/O for storing info in this this binary log.


include/my_sys.h:
  Added disk_writes member to the IO_CACHE structure for counting number
  of times when IO_CACHE was forced to write to disk.
mysql-test/r/rpl_relayrotate.result:
  Fixed test result since added test for binlog_cache_use and 
  binlog_cache_disk_use status variables.
mysql-test/t/rpl_relayrotate.test:
  Added test for binlog_cache_use and binlog_cache_disk_use status 
  variables.
  Now dropping t1 table on master too.
mysys/mf_iocache.c:
  Added disk_writes member to the IO_CACHE structure for counting number
  of times when IO_CACHE was forced to write to disk.
sql/handler.cc:
  Added support for binlog_cache_use and binlog_cache_disk_use status
  variable. First one is incremented if transaction used somehow 
  transaction temporary binary log (doesn't matter in memory only or 
  with writes to disk), the second one is incremented if this binary 
  log was flushed to disk at some point.
sql/mysql_priv.h:
  Added declaration of status variables binlog_cache_use and 
  binlog_cache_disk_use.
sql/mysqld.cc:
  Added status variables binlog_cache_use and binlog_cache_disk_use.
BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
2004-04-02 00:47:20 +04:00

92 lines
3 KiB
Text

# When the relay log gets rotated while the I/O thread
# is reading a transaction, the transaction spans on two or more
# relay logs. If STOP SLAVE occurs while the SQL thread is
# executing a part of the transaction in the non-first relay logs,
# we test if START SLAVE will resume in the beginning of the
# transaction (i.e., step back to the first relay log)
# The slave is started with max_binlog_size=16384 bytes,
# to force many rotations (approximately 30 rotations)
# If the master or slave does not support InnoDB, this test will pass
source include/master-slave.inc;
connection slave;
stop slave;
connection master;
--disable_warnings
create table t1 (a int) engine=innodb;
--enable_warnings
let $1=8000;
disable_query_log;
begin;
while ($1)
{
# eval means expand $ expressions
eval insert into t1 values( $1 );
dec $1;
}
commit;
# This will generate a 500kB master's binlog,
# which corresponds to 30 slave's relay logs.
enable_query_log;
save_master_pos;
connection slave;
reset slave;
start slave;
# We wait 1 sec for the SQL thread to be somewhere in
# the middle of the transaction, hopefully not in
# the first relay log, and hopefully before the COMMIT.
# Usually it stops when the SQL thread is around the 15th relay log.
# We cannot use MASTER_POS_WAIT() as master's position
# increases only when the slave executes the COMMIT.
# Note that except when using Valgrind, 1 second is enough for the I/O slave
# thread to fetch the whole master's binlog.
sleep 1;
stop slave;
# We suppose the SQL thread stopped before COMMIT.
# If so the transaction was rolled back
# and the table is now empty.
# Now restart
start slave;
# And see if the table contains '8000'
# which proves that the transaction restarted at
# the right place.
# We must wait for the transaction to commit before
# reading, MASTER_POS_WAIT() will do it for sure
# (the only statement with position>=3000 is COMMIT).
select master_pos_wait('master-bin.001',3000)>=0;
select * from t1 where a=8000;
connection master;
# binlog_cache_use and binlog_cache_disk_use status vars test
# This test uses the previous test. Namely, it needs the long
# transaction that adds 8000 lines to the t1 table.
show status like "binlog_cache_use";
show status like "binlog_cache_disk_use";
# transaction which should not be flushed to disk and so should not
# increase binlog_cache_disk_use
begin;
delete from t1;
commit;
show status like "binlog_cache_use";
show status like "binlog_cache_disk_use";
# The following DROP is a very important cleaning task:
# imagine the next test is run with --skip-innodb: it will do
# DROP TABLE IF EXISTS t1; but this will delete the frm and leave
# some data in the InnoDB datafile (because at that time mysqld
# does not know about InnoDB : --skip-innodb). So if later in the
# test suite a test wants to create an InnoDB table called t1, it
# will fail with
# InnoDB: Error: table t1 already exists in InnoDB internal
# InnoDB: data dictionary. Have you deleted the .frm file etc
drop table t1;
# wait until this drop is executed on slave
save_master_pos;
connection slave;
sync_with_master;