Details
-
Bug
-
Status: Closed (View Workflow)
-
Blocker
-
Resolution: Fixed
-
10.2(EOL), 10.3(EOL), 10.4(EOL), 10.5, 10.6
Description
row event execution starts from Rows_log_event::do_apply_event which calls open_and_lock_tables() which calls lock_tables(), which does
if (!(ptr=start=(TABLE**) thd->alloc(sizeof(TABLE*)*count))) |
thus allocating an array of points of the thd's memroot. This is just few bytes, 8 in the test below. But this memory is never freed, not by row events at least. So, by creating a transaction with a huge number of row events we can consume any amount of memory.
source include/have_innodb.inc;
|
source include/have_binlog_format_row.inc;
|
source include/master-slave.inc;
|
create table t1 (a int) engine=innodb; |
insert t1 values (1); |
|
sync_slave_with_master;
|
stop slave;
|
set global max_session_mem_used=10*1024*1024; |
start slave;
|
|
connection master; |
let $a=1000000;
|
start transaction; |
disable_query_log;
|
while ($a) {
|
update t1 set a=a+1; |
dec $a; |
}
|
enable_query_log;
|
commit; |
drop table t1; |
sync_slave_with_master;
|
set global max_session_mem_used=default; |
source include/rpl_end.inc;
|
To fix that, rbr events must do
free_root(thd->mem_root, MYF(MY_KEEP_PREALLOC));
|
somewhere. Where it's safe, because it'll destroy anything allocated on the thd memroot.
This patch appears to be working fine, it frees thd memroot after closing all opened tables:
--- a/sql/rpl_rli.cc
|
+++ b/sql/rpl_rli.cc
|
@@ -2326,6 +2326,7 @@ void rpl_group_info::cleanup_context(THD *thd, bool error) |
*/
|
reset_row_stmt_start_timestamp();
|
unset_long_find_row_note_printed();
|
+ free_root(thd->mem_root, MYF(MY_KEEP_PREALLOC));
|
|
DBUG_EXECUTE_IF("inject_sleep_gtid_100_x_x", { |
if (current_gtid.domain_id == 100) |
Attachments
Issue Links
- relates to
-
MDEV-20455 memory leak in 10.4 series
- Closed
- mentioned in
-
Page Loading...