Commit b920ab26 authored by unknown's avatar unknown

4 small items in this:

- 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.
parent 40ed42e1
Branches unavailable
Tags unavailable
No related merge requests found
...@@ -36,10 +36,6 @@ ...@@ -36,10 +36,6 @@
extern int h_errno; extern int h_errno;
#endif #endif
#ifndef HAVE_IN_ADDR_T
#define in_addr_t ulong
#endif
static my_bool silent; static my_bool silent;
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
......
...@@ -63,6 +63,15 @@ C_MODE_START ...@@ -63,6 +63,15 @@ C_MODE_START
#define O_NONBLOCK 1 /* For emulation of fcntl() */ #define O_NONBLOCK 1 /* For emulation of fcntl() */
#endif #endif
/*
On OSes which don't have the in_addr_t, we guess that using uint32 is the best
possible choice. We guess this from the fact that on HP-UX64bit & FreeBSD64bit
& Solaris64bit, in_addr_t is equivalent to uint32. And on Linux32bit too.
*/
#ifndef HAVE_IN_ADDR_T
#define in_addr_t uint32
#endif
/* Thread safe or portable version of some functions */ /* Thread safe or portable version of some functions */
void my_inet_ntoa(struct in_addr in, char *buf); void my_inet_ntoa(struct in_addr in, char *buf);
......
...@@ -1623,7 +1623,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -1623,7 +1623,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
char buff[NAME_LEN+USERNAME_LENGTH+100],charset_name_buff[16]; char buff[NAME_LEN+USERNAME_LENGTH+100],charset_name_buff[16];
char *end,*host_info,*charset_name; char *end,*host_info,*charset_name;
my_socket sock; my_socket sock;
uint32 ip_addr; in_addr_t ip_addr;
struct sockaddr_in sock_addr; struct sockaddr_in sock_addr;
ulong pkt_length; ulong pkt_length;
NET *net= &mysql->net; NET *net= &mysql->net;
......
...@@ -90,7 +90,7 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con, ...@@ -90,7 +90,7 @@ MYSQL_MANAGER* STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
{ {
my_socket sock; my_socket sock;
struct sockaddr_in sock_addr; struct sockaddr_in sock_addr;
uint32 ip_addr; in_addr_t ip_addr;
char msg_buf[MAX_MYSQL_MANAGER_MSG]; char msg_buf[MAX_MYSQL_MANAGER_MSG];
int msg_len; int msg_len;
Vio* vio; Vio* vio;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# stop/restart servers. Note that if assumptions are wrong, the test will not # stop/restart servers. Note that if assumptions are wrong, the test will not
# fail; it will just fail to test the error-prone scenario. # 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. # Using the manager is the only way to have more than one slave server.
# So you must run this test with --manager.
require_manager; require_manager;
server_stop master; server_stop master;
...@@ -87,3 +88,12 @@ drop table t2; ...@@ -87,3 +88,12 @@ drop table t2;
save_master_pos; save_master_pos;
connection slave_sec; connection slave_sec;
sync_with_master; 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.
...@@ -874,7 +874,7 @@ Query_log_event::Query_log_event(const char* buf, int event_len, ...@@ -874,7 +874,7 @@ Query_log_event::Query_log_event(const char* buf, int event_len,
return; return;
memcpy(data_buf, buf + Q_DATA_OFFSET, data_len); memcpy(data_buf, buf + Q_DATA_OFFSET, data_len);
thread_id = uint4korr(buf + Q_THREAD_ID_OFFSET); slave_proxy_id= thread_id= uint4korr(buf + Q_THREAD_ID_OFFSET);
db = data_buf; db = data_buf;
db_len = (uint)buf[Q_DB_LEN_OFFSET]; db_len = (uint)buf[Q_DB_LEN_OFFSET];
query=data_buf + db_len + 1; query=data_buf + db_len + 1;
...@@ -955,8 +955,7 @@ int Query_log_event::write_data(IO_CACHE* file) ...@@ -955,8 +955,7 @@ int Query_log_event::write_data(IO_CACHE* file)
SET PSEUDO_THREAD_ID= SET PSEUDO_THREAD_ID=
for each query using temp tables. for each query using temp tables.
*/ */
int4store(buf + Q_THREAD_ID_OFFSET, (slave_proxy_id ? slave_proxy_id : int4store(buf + Q_THREAD_ID_OFFSET, slave_proxy_id);
thread_id));
int4store(buf + Q_EXEC_TIME_OFFSET, exec_time); int4store(buf + Q_EXEC_TIME_OFFSET, exec_time);
buf[Q_DB_LEN_OFFSET] = (char) db_len; buf[Q_DB_LEN_OFFSET] = (char) db_len;
int2store(buf + Q_ERR_CODE_OFFSET, error_code); int2store(buf + Q_ERR_CODE_OFFSET, error_code);
...@@ -1057,8 +1056,7 @@ void Rand_log_event::print(FILE* file, bool short_form, char* last_db) ...@@ -1057,8 +1056,7 @@ void Rand_log_event::print(FILE* file, bool short_form, char* last_db)
int Load_log_event::write_data_header(IO_CACHE* file) int Load_log_event::write_data_header(IO_CACHE* file)
{ {
char buf[LOAD_HEADER_LEN]; char buf[LOAD_HEADER_LEN];
int4store(buf + L_THREAD_ID_OFFSET, (slave_proxy_id ? slave_proxy_id : int4store(buf + L_THREAD_ID_OFFSET, slave_proxy_id);
thread_id));
int4store(buf + L_EXEC_TIME_OFFSET, exec_time); int4store(buf + L_EXEC_TIME_OFFSET, exec_time);
int4store(buf + L_SKIP_LINES_OFFSET, skip_lines); int4store(buf + L_SKIP_LINES_OFFSET, skip_lines);
buf[L_TBL_LEN_OFFSET] = (char)table_name_len; buf[L_TBL_LEN_OFFSET] = (char)table_name_len;
...@@ -1276,7 +1274,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -1276,7 +1274,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
char* buf_end = (char*)buf + event_len; char* buf_end = (char*)buf + event_len;
uint header_len= old_format ? OLD_HEADER_LEN : LOG_EVENT_HEADER_LEN; uint header_len= old_format ? OLD_HEADER_LEN : LOG_EVENT_HEADER_LEN;
const char* data_head = buf + header_len; const char* data_head = buf + header_len;
thread_id = uint4korr(data_head + L_THREAD_ID_OFFSET); slave_proxy_id= thread_id= uint4korr(data_head + L_THREAD_ID_OFFSET);
exec_time = uint4korr(data_head + L_EXEC_TIME_OFFSET); exec_time = uint4korr(data_head + L_EXEC_TIME_OFFSET);
skip_lines = uint4korr(data_head + L_SKIP_LINES_OFFSET); skip_lines = uint4korr(data_head + L_SKIP_LINES_OFFSET);
table_name_len = (uint)data_head[L_TBL_LEN_OFFSET]; table_name_len = (uint)data_head[L_TBL_LEN_OFFSET];
......
...@@ -547,7 +547,7 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -547,7 +547,7 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
{ {
char buff[NAME_LEN+USERNAME_LENGTH+100],*end,*host_info; char buff[NAME_LEN+USERNAME_LENGTH+100],*end,*host_info;
my_socket sock; my_socket sock;
uint32 ip_addr; in_addr_t ip_addr;
struct sockaddr_in sock_addr; struct sockaddr_in sock_addr;
ulong pkt_length; ulong pkt_length;
NET *net= &mysql->net; NET *net= &mysql->net;
......
...@@ -324,6 +324,20 @@ void init_slave_skip_errors(const char* arg) ...@@ -324,6 +324,20 @@ void init_slave_skip_errors(const char* arg)
} }
} }
void st_relay_log_info::close_temporary_tables()
{
TABLE *table,*next;
for (table=save_temporary_tables ; table ; table=next)
{
next=table->next;
/*
Don't ask for disk deletion. For now, anyway they will be deleted when
slave restarts, but it is a better intention to not delete them.
*/
close_temporary(table, 0);
}
}
/* /*
We assume we have a run lock on rli and that both slave thread We assume we have a run lock on rli and that both slave thread
...@@ -790,6 +804,7 @@ static int end_slave_on_walk(MASTER_INFO* mi, gptr /*unused*/) ...@@ -790,6 +804,7 @@ static int end_slave_on_walk(MASTER_INFO* mi, gptr /*unused*/)
void end_slave() void end_slave()
{ {
/* This is called when the server terminates, in close_connections(). */
if (active_mi) if (active_mi)
{ {
/* /*
...@@ -3092,6 +3107,12 @@ void end_relay_log_info(RELAY_LOG_INFO* rli) ...@@ -3092,6 +3107,12 @@ void end_relay_log_info(RELAY_LOG_INFO* rli)
} }
rli->inited = 0; rli->inited = 0;
rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT); rli->relay_log.close(LOG_CLOSE_INDEX | LOG_CLOSE_STOP_EVENT);
/*
Delete the slave's temporary tables from memory.
In the future there will be other actions than this, to ensure persistance
of slave's temp tables after shutdown.
*/
rli->close_temporary_tables();
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -239,6 +239,7 @@ typedef struct st_relay_log_info ...@@ -239,6 +239,7 @@ typedef struct st_relay_log_info
int wait_for_pos(THD* thd, String* log_name, longlong log_pos, int wait_for_pos(THD* thd, String* log_name, longlong log_pos,
longlong timeout); longlong timeout);
void st_relay_log_info::close_temporary_tables();
} RELAY_LOG_INFO; } RELAY_LOG_INFO;
......
...@@ -323,6 +323,11 @@ bool THD::store_globals() ...@@ -323,6 +323,11 @@ bool THD::store_globals()
return 1; return 1;
mysys_var=my_thread_var; mysys_var=my_thread_var;
dbug_thread_id=my_thread_id(); dbug_thread_id=my_thread_id();
/*
By default 'slave_proxy_id' is 'thread_id'. They may later become different
if this is the slave SQL thread.
*/
slave_proxy_id= thread_id;
return 0; return 0;
} }
......
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