mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	- 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.
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  # 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.
 |