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.
This commit is contained in:
parent
e2268b8e1e
commit
b100506323
@ -17,6 +17,7 @@
|
||||
# working when expected.
|
||||
|
||||
--source include/master-slave.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
|
@ -18,6 +18,7 @@
|
||||
# executing events this time
|
||||
|
||||
source include/master-slave.inc;
|
||||
source include/have_binlog_format_mixed.inc;
|
||||
|
||||
connection slave;
|
||||
|
||||
|
@ -1673,6 +1673,11 @@ void THD::cleanup_after_query()
|
||||
/* reset table map for multi-table update */
|
||||
table_map_for_update= 0;
|
||||
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()
|
||||
plugins_static_buffer,
|
||||
INITIAL_LEX_PLUGIN_LIST_SIZE,
|
||||
INITIAL_LEX_PLUGIN_LIST_SIZE);
|
||||
memset(&mi, 0, sizeof(LEX_MASTER_INFO));
|
||||
reset_query_tables_list(TRUE);
|
||||
}
|
||||
|
||||
|
@ -292,6 +292,7 @@ typedef struct st_lex_master_info
|
||||
char *relay_log_name;
|
||||
ulong relay_log_pos;
|
||||
DYNAMIC_ARRAY repl_ignore_server_ids;
|
||||
typeof(::server_id) server_ids_buffer[2];
|
||||
} LEX_MASTER_INFO;
|
||||
|
||||
typedef struct st_lex_reset_slave
|
||||
|
@ -1689,7 +1689,6 @@ err:
|
||||
thd_proc_info(thd, 0);
|
||||
if (ret == FALSE)
|
||||
my_ok(thd);
|
||||
delete_dynamic(&lex_mi->repl_ignore_server_ids); //freeing of parser-time alloc
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
|
@ -1863,12 +1863,9 @@ change:
|
||||
LEX *lex = Lex;
|
||||
lex->sql_command = SQLCOM_CHANGE_MASTER;
|
||||
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;
|
||||
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
|
||||
{}
|
||||
@ -1979,6 +1976,14 @@ ignore_server_id_list:
|
||||
ignore_server_id:
|
||||
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));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user