Commit ed3e19ac authored by Andrei Elkin's avatar Andrei Elkin

Bug#13437900 - VALGRIND REPORTS A LEAK FOR REPL_IGNORE_SERVER_IDS

There was memory leak when running some tests on PB2.
The reason of the failure is an early return from change_master()
that was supposed to deallocate a dyn-array.

Actually the same bug58915 was fixed in trunk with relocating the dyn-array
destruction into THD::cleanup_after_query() which can't be bypassed.
The current patch backports magne.mahre@oracle.com-20110203101306-q8auashb3d7icxho
and adds two optimizations: were done: the static buffer for the dyn-array to base on,
and the array initialization is called precisely when it's necessary rather than
per each CHANGE-MASTER as before.


mysql-test/suite/rpl/t/rpl_empty_master_host.test:
  the test is binlog-format insensitive so it will be run with MIXED mode only.
mysql-test/suite/rpl/t/rpl_server_id_ignore.test:
  the test is binlog-format insensitive so it will be run with MIXED mode only.
sql/sql_class.cc:
  relocating the dyn-array
  destruction into THD::cleanup_after_query().
sql/sql_lex.cc:
  LEX.mi zero initialization is done in LEX().
sql/sql_lex.h:
  Optimization for repl_ignore_server_ids to base on a static buffer
  which size is chosen to fit to most common use cases.
sql/sql_repl.cc:
  dyn-array destruction is relocated to THD::cleanup_after_query().
sql/sql_yacc.yy:
  Refining logics of Lex->mi.repl_ignore_server_ids initialization.
  The array is initialized once a corresponding option in CHANGE MASTER token sequence
  is found.
parent 2b05ef11
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
# working when expected. # working when expected.
--source include/master-slave.inc --source include/master-slave.inc
--source include/have_binlog_format_mixed.inc
connection slave; connection slave;
STOP SLAVE; STOP SLAVE;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
# executing events this time # executing events this time
source include/master-slave.inc; source include/master-slave.inc;
source include/have_binlog_format_mixed.inc;
connection slave; connection slave;
......
...@@ -1673,6 +1673,11 @@ void THD::cleanup_after_query() ...@@ -1673,6 +1673,11 @@ void THD::cleanup_after_query()
/* reset table map for multi-table update */ /* reset table map for multi-table update */
table_map_for_update= 0; table_map_for_update= 0;
m_binlog_invoker= FALSE; m_binlog_invoker= FALSE;
/* reset replication info structure */
if (lex && lex->mi.repl_ignore_server_ids.buffer)
{
delete_dynamic(&lex->mi.repl_ignore_server_ids);
}
} }
......
...@@ -2351,6 +2351,7 @@ LEX::LEX() ...@@ -2351,6 +2351,7 @@ LEX::LEX()
plugins_static_buffer, plugins_static_buffer,
INITIAL_LEX_PLUGIN_LIST_SIZE, INITIAL_LEX_PLUGIN_LIST_SIZE,
INITIAL_LEX_PLUGIN_LIST_SIZE); INITIAL_LEX_PLUGIN_LIST_SIZE);
memset(&mi, 0, sizeof(LEX_MASTER_INFO));
reset_query_tables_list(TRUE); reset_query_tables_list(TRUE);
} }
......
...@@ -292,6 +292,7 @@ typedef struct st_lex_master_info ...@@ -292,6 +292,7 @@ typedef struct st_lex_master_info
char *relay_log_name; char *relay_log_name;
ulong relay_log_pos; ulong relay_log_pos;
DYNAMIC_ARRAY repl_ignore_server_ids; DYNAMIC_ARRAY repl_ignore_server_ids;
typeof(::server_id) server_ids_buffer[2];
} LEX_MASTER_INFO; } LEX_MASTER_INFO;
typedef struct st_lex_reset_slave typedef struct st_lex_reset_slave
......
...@@ -1689,7 +1689,6 @@ err: ...@@ -1689,7 +1689,6 @@ err:
thd_proc_info(thd, 0); thd_proc_info(thd, 0);
if (ret == FALSE) if (ret == FALSE)
my_ok(thd); my_ok(thd);
delete_dynamic(&lex_mi->repl_ignore_server_ids); //freeing of parser-time alloc
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
......
...@@ -1863,12 +1863,9 @@ change: ...@@ -1863,12 +1863,9 @@ change:
LEX *lex = Lex; LEX *lex = Lex;
lex->sql_command = SQLCOM_CHANGE_MASTER; lex->sql_command = SQLCOM_CHANGE_MASTER;
bzero((char*) &lex->mi, sizeof(lex->mi)); bzero((char*) &lex->mi, sizeof(lex->mi));
/*
resetting flags that can left from the previous CHANGE MASTER
*/
lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_UNCHANGED; lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_UNCHANGED;
my_init_dynamic_array(&Lex->mi.repl_ignore_server_ids,
sizeof(::server_id), 16, 16); DBUG_ASSERT(Lex->mi.repl_ignore_server_ids.elements == 0);
} }
master_defs master_defs
{} {}
...@@ -1979,6 +1976,14 @@ ignore_server_id_list: ...@@ -1979,6 +1976,14 @@ ignore_server_id_list:
ignore_server_id: ignore_server_id:
ulong_num ulong_num
{ {
if (Lex->mi.repl_ignore_server_ids.elements == 0)
{
my_init_dynamic_array2(&Lex->mi.repl_ignore_server_ids,
sizeof(::server_id),
Lex->mi.server_ids_buffer,
array_elements(Lex->mi.server_ids_buffer),
16);
}
insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &($1)); insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &($1));
} }
......
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