mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
b920ab261e
- when we don't have in_addr_t, use uint32. - a forgotten initialization of slave_proxy_id in sql/log_event.cc (was not really "forgot", was "we needn't init it there", but there was one case where we needed...). - made slave_proxy_id always meaningful in THD and Log_event, so we can rely more on it (no need to test if it's meaningful). THD::slave_proxy_id is equal to THD::thread_id except for the slave SQL thread. - clean up the slave's temporary table (i.e. free their memory) when slave server shuts down. extra/resolveip.c: removed #define as it is simpler to put it in my_net.h (because we need the #define elsewhere) include/my_net.h: When in_addr_t is not defined, use uint32. libmysql/libmysql.c: using in_addr_t is more generic. libmysql/manager.c: using in_addr_t is more generic. mysql-test/t/rpl_chain_temp_table.test: comments sql/log_event.cc: * Had forgot to initialize slave_proxy_id in the event constructor (char* buf...). Initializing is in fact only needed for Create_file_log_event, because it uses slave_proxy_id even if it does not write an event to the binlog (it uses slave_proxy_id to write it to SQL-LOAD.info). * When we write events we now always write slave_proxy_id, which is now always meaningful (as thd->slave_proxy_id is now always meaningful, see change in sql_class.cc). sql/mini_client.cc: in_addr_t is more generic. sql/slave.cc: A RELAY_LOG_INFO method to free the slave's temporary tables from memory at slave's server shutdown. It is called by end_slave(), which is called by close_connections(), which is called when the server terminates (close_connections() is just before clean_up(); putting the call in clean_up() was buggy, as active_mi is already deleted by close_connections(). sql/slave.h: new method sql/sql_class.cc: By default we set THD::slave_proxy_id to THD::thread_id, so THD::slave_proxy_id is always meaningful (not 0). It's always the same as the thread id except for the slave SQL thread.
99 lines
3 KiB
Text
99 lines
3 KiB
Text
# This test makes some assumptions about values of thread ids, which should be
|
|
# true if the servers have been restarted for this test. So we want to
|
|
# stop/restart servers. Note that if assumptions are wrong, the test will not
|
|
# fail; it will just fail to test the error-prone scenario.
|
|
# Using the manager is the only way to have more than one slave server.
|
|
# So you must run this test with --manager.
|
|
|
|
require_manager;
|
|
server_stop master;
|
|
server_start master;
|
|
server_stop slave;
|
|
server_start slave;
|
|
# no need for slave_sec (no assumptions on thread ids for this server).
|
|
|
|
source include/master-slave.inc;
|
|
connect (slave_sec,localhost,root,,test,0,slave.sock-1);
|
|
connection master;
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
reset master;
|
|
save_master_pos;
|
|
connection slave_sec;
|
|
eval change master to master_host='127.0.0.1',master_port=$SLAVE_MYPORT, master_user='root';
|
|
start slave;
|
|
sync_with_master;
|
|
|
|
# :P now we have a chain ready-to-test.
|
|
|
|
connection master;
|
|
create temporary table t1 (a int);
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
connection master1;
|
|
create temporary table t1 (a int);
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
save_master_pos;
|
|
|
|
# First test:
|
|
|
|
connection slave_sec;
|
|
# Before BUG#1686 ("If 2 master threads with same-name temp table, slave makes
|
|
# bad binlog") was fixed, sync_with_master failed
|
|
sync_with_master;
|
|
show status like 'slave_open_temp_tables';
|
|
|
|
# 'master' and 'master1' usually have thread id 2-3 or 3-4.
|
|
# 'slave' and 'slave1' usually have thread id 2-3.
|
|
connection slave;
|
|
create temporary table t1 (a int);
|
|
connection slave1;
|
|
create temporary table t1 (a int);
|
|
# So it's likely that in the binlog of slave we get
|
|
# server_id=of_master thread_id=3 create temp...
|
|
# server_id=of_slave thread_id=3 create temp...
|
|
# which would confuse slave-sec unless slave-sec uses server id to distinguish
|
|
# between temp tables (here thread id is obviously not enough to distinguish).
|
|
|
|
save_master_pos;
|
|
|
|
# Second test:
|
|
|
|
connection slave_sec;
|
|
# If we did not use the server id to distinguish between temp tables,
|
|
# sync_with_master would fail
|
|
sync_with_master;
|
|
show status like 'slave_open_temp_tables';
|
|
|
|
# Third test (BUG#1240 "slave of slave breaks when STOP SLAVE was issud on
|
|
# parent slave and temp tables").
|
|
stop slave;
|
|
connection slave;
|
|
insert into t1 values(1);
|
|
create table t2 as select * from t1;
|
|
save_master_pos;
|
|
connection slave_sec;
|
|
start slave;
|
|
sync_with_master;
|
|
show status like 'slave_open_temp_tables';
|
|
select * from t2;
|
|
|
|
# clean up
|
|
connection slave;
|
|
drop table t2;
|
|
save_master_pos;
|
|
connection slave_sec;
|
|
sync_with_master;
|
|
|
|
# On purpose, we don't delete the temporary tables explicitely.
|
|
# So temp tables remain on slave (remember they are not deleted when the slave
|
|
# SQL thread terminates). If you run this test with
|
|
# --valgrind --valgrind-options=--show-reachable=yes
|
|
# you will see if they get cleaned up at slave's shutdown (that is, if the
|
|
# memory they use is freed (it should) by mysqld before it terminates).
|
|
# If they wouldn't be cleaned up, you would see some "still reachable" blocks in
|
|
# Valgrind.
|