fixed improper read of log name from master.info which broke slave server restart

fixed sync bugs in three test cases
added offset argument to sync_with_master to mysqltest to be able to fix sync bugs
added a test case for slave startup with existing master.info
expanded mysql-test-run.sh to be able to run pre-start shell script initializations
parent 0ae142f5
...@@ -485,14 +485,19 @@ int do_echo(struct st_query* q) ...@@ -485,14 +485,19 @@ int do_echo(struct st_query* q)
return 0; return 0;
} }
int do_sync_with_master() int do_sync_with_master(struct st_query* q)
{ {
MYSQL_RES* res; MYSQL_RES* res;
MYSQL_ROW row; MYSQL_ROW row;
MYSQL* mysql = &cur_con->mysql; MYSQL* mysql = &cur_con->mysql;
char query_buf[FN_REFLEN+128]; char query_buf[FN_REFLEN+128];
int offset = 0;
char* p = q->first_argument;
if(*p)
offset = atoi(p);
sprintf(query_buf, "select master_pos_wait('%s', %ld)", master_pos.file, sprintf(query_buf, "select master_pos_wait('%s', %ld)", master_pos.file,
master_pos.pos); master_pos.pos + offset);
if(mysql_query(mysql, query_buf)) if(mysql_query(mysql, query_buf))
die("At line %u: failed in %s: %d: %s", start_lineno, query_buf, die("At line %u: failed in %s: %d: %s", start_lineno, query_buf,
mysql_errno(mysql), mysql_error(mysql)); mysql_errno(mysql), mysql_error(mysql));
......
...@@ -72,6 +72,7 @@ cd .. ...@@ -72,6 +72,7 @@ cd ..
BASEDIR=`pwd` BASEDIR=`pwd`
cd $CWD cd $CWD
MYSQL_TEST_DIR=$BASEDIR/mysql-test MYSQL_TEST_DIR=$BASEDIR/mysql-test
export MYSQL_TEST_DIR
STD_DATA=$MYSQL_TEST_DIR/std_data STD_DATA=$MYSQL_TEST_DIR/std_data
hostname=`hostname` # Installed in the mysql privilege table hostname=`hostname` # Installed in the mysql privilege table
...@@ -336,6 +337,11 @@ gcov_collect () { ...@@ -336,6 +337,11 @@ gcov_collect () {
start_master() start_master()
{ {
[ x$MASTER_RUNNING = 1 ] && return [ x$MASTER_RUNNING = 1 ] && return
#run master initialization shell script if one exists
if [ -f "$master_init_script" ] ;
then
/bin/sh $master_init_script
fi
cd $BASEDIR # for gcov cd $BASEDIR # for gcov
# Remove old berkeley db log files that can confuse the server # Remove old berkeley db log files that can confuse the server
$RM -f $MASTER_MYDDIR/log.* $RM -f $MASTER_MYDDIR/log.*
...@@ -375,6 +381,13 @@ start_slave() ...@@ -375,6 +381,13 @@ start_slave()
{ {
[ x$SKIP_SLAVE = x1 ] && return [ x$SKIP_SLAVE = x1 ] && return
[ x$SLAVE_RUNNING = 1 ] && return [ x$SLAVE_RUNNING = 1 ] && return
#run slave initialization shell script if one exists
if [ -f "$slave_init_script" ] ;
then
/bin/sh $slave_init_script
fi
if [ -z "$SLAVE_MASTER_INFO" ] ; then if [ -z "$SLAVE_MASTER_INFO" ] ; then
master_info="--master-user=root \ master_info="--master-user=root \
--master-connect-retry=1 \ --master-connect-retry=1 \
...@@ -502,6 +515,8 @@ run_testcase () ...@@ -502,6 +515,8 @@ run_testcase ()
tname=`$BASENAME $tf .test` tname=`$BASENAME $tf .test`
master_opt_file=$TESTDIR/$tname-master.opt master_opt_file=$TESTDIR/$tname-master.opt
slave_opt_file=$TESTDIR/$tname-slave.opt slave_opt_file=$TESTDIR/$tname-slave.opt
master_init_script=$TESTDIR/$tname-master.sh
slave_init_script=$TESTDIR/$tname-slave.sh
slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt slave_master_info_file=$TESTDIR/$tname-slave-master-info.opt
SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0` SKIP_SLAVE=`$EXPR \( $tname : rpl \) = 0`
......
...@@ -7,8 +7,6 @@ Log_name ...@@ -7,8 +7,6 @@ Log_name
master-bin.001 master-bin.001
master-bin.002 master-bin.002
master-bin.003 master-bin.003
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter
127.0.0.1 root 9306 60 master-bin.003 129 Yes 1062 error 'Duplicate entry '1234' for key 1' on query 'insert into t2 values(1234)' 0
Log_name Log_name
master-bin.003 master-bin.003
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter
......
...@@ -10,20 +10,26 @@ connection master1; ...@@ -10,20 +10,26 @@ connection master1;
create temporary table t1 (n int); create temporary table t1 (n int);
insert into t1 values (4),(5); insert into t1 values (4),(5);
insert into t2 select * from t1; insert into t2 select * from t1;
save_master_pos;
disconnect master; disconnect master;
connection slave;
#add 1 to the saved position, so we will catch drop table on disconnect
#for sure
sync_with_master 1;
connection master1; connection master1;
insert into t2 values(6); insert into t2 values(6);
disconnect master1;
connect (master2,localhost,root,,test,0,mysql-master.sock);
connection master2;
save_master_pos; save_master_pos;
disconnect master1;
connection slave; connection slave;
sync_with_master; #same trick - make sure we catch drop of temporary table on disconnect
sync_with_master 1;
@r/rpl000012.result select * from t2; @r/rpl000012.result select * from t2;
@r/rpl000012.status.result show status like 'Slave_open_temp_tables'; @r/rpl000012.status.result show status like 'Slave_open_temp_tables';
# #
# Clean up # Clean up
# #
connect (master2,localhost,root,,test,0,mysql-master.sock);
connection master2; connection master2;
drop table if exists t1,t2; drop table if exists t1,t2;
save_master_pos; save_master_pos;
......
...@@ -13,20 +13,24 @@ connection master1; ...@@ -13,20 +13,24 @@ connection master1;
create temporary table t1 (n int); create temporary table t1 (n int);
insert into t1 values (4),(5); insert into t1 values (4),(5);
insert into t2 select * from t1; insert into t2 select * from t1;
save_master_pos;
disconnect master; disconnect master;
connection slave;
#add 1 to catch drop table
sync_with_master 1;
connection master1; connection master1;
insert into t2 values(6); insert into t2 values(6);
disconnect master1;
connect (master2,localhost,root,,test,0,mysql-master.sock);
connection master2;
save_master_pos; save_master_pos;
disconnect master1;
connection slave; connection slave;
sync_with_master; # same trick to go one more event
sync_with_master 1;
@r/rpl000013.result select * from t2; @r/rpl000013.result select * from t2;
@r/rpl000013.status.result show status like 'Slave_open_temp_tables'; @r/rpl000013.status.result show status like 'Slave_open_temp_tables';
# #
# Clean up # Clean up
# #
connect (master2,localhost,root,,test,0,mysql-master.sock);
connection master2; connection master2;
drop table if exists t1,t2; drop table if exists t1,t2;
save_master_pos; save_master_pos;
......
...@@ -31,28 +31,34 @@ insert into t2 values (34),(67),(123); ...@@ -31,28 +31,34 @@ insert into t2 values (34),(67),(123);
save_master_pos; save_master_pos;
flush logs; flush logs;
show master logs; show master logs;
#now lets make some duplicate key mess and see if we can recover from it #now lets make some duplicate key mess and see if we can recover from it
#first insert a value on the slave #first insert a value on the slave
connection slave; connection slave;
sync_with_master; sync_with_master;
insert into t2 values(1234); insert into t2 values(1234);
#same value on the master #same value on the master
connection master; connection master;
save_master_pos; save_master_pos;
insert into t2 values(1234); insert into t2 values(1234);
connection slave; connection slave;
sync_with_master; sync_with_master;
#the slave may have already stopped, so we ignore the error #the slave may have already stopped, so we ignore the error
!slave stop; !slave stop;
#restart slave skipping one event #restart slave skipping one event
set sql_slave_skip_counter=1; set sql_slave_skip_counter=1;
slave start; slave start;
connection master; connection master;
save_master_pos; save_master_pos;
#let slave catch up #let slave catch up
connection slave; connection slave;
sync_with_master; sync_with_master;
show slave status;
connection master; connection master;
purge master logs to 'master-bin.003'; purge master logs to 'master-bin.003';
show master logs; show master logs;
...@@ -74,6 +80,8 @@ while ($1) ...@@ -74,6 +80,8 @@ while ($1)
show master logs; show master logs;
save_master_pos; save_master_pos;
connection slave; connection slave;
slave stop;
slave start;
sync_with_master; sync_with_master;
select count(*) from t3 where n = 4; select count(*) from t3 where n = 4;
#clean up #clean up
......
cat > $MYSQL_TEST_DIR/var/slave-data/master.info <<EOF
master-bin.001
4
127.0.0.1
root
9306
1
EOF
connect (master,localhost,root,,test,0,mysql-master.sock);
connect (slave,localhost,root,,test,0,mysql-slave.sock);
connection master;
reset master;
connection slave;
slave start;
connection master;
drop table if exists t1;
create table t1(n int);
insert into t1 values(24);
save_master_pos;
connection slave;
sync_with_master;
select * from t1;
connection master;
drop table t1;
save_master_pos;
connection slave;
sync_with_master;
...@@ -509,14 +509,14 @@ int init_master_info(MASTER_INFO* mi) ...@@ -509,14 +509,14 @@ int init_master_info(MASTER_INFO* mi)
return 1; return 1;
} }
if (!(length=my_b_gets(&mi->file, mi->log_file_name, if ((length=my_b_gets(&mi->file, mi->log_file_name,
sizeof(mi->log_file_name)))) sizeof(mi->log_file_name))) < 1)
{ {
msg="Error reading log file name from master info file "; msg="Error reading log file name from master info file ";
goto error; goto error;
} }
mi->log_file_name[length]= 0; // kill \n mi->log_file_name[length-1]= 0; // kill \n
char buf[FN_REFLEN]; char buf[FN_REFLEN];
if(!my_b_gets(&mi->file, buf, sizeof(buf))) if(!my_b_gets(&mi->file, buf, sizeof(buf)))
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment