[MDEV-10543] Memory leak when "replacing into" on a Aria table with Text field Created: 2016-08-11  Updated: 2020-09-17  Resolved: 2020-09-17

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - Aria
Affects Version/s: 10.0.24, 10.1.16, 5.5, 10.0, 10.1
Fix Version/s: 5.5.60, 10.0.35, 10.1.32, 10.2.14, 10.3.5

Type: Bug Priority: Major
Reporter: Risato Stefano Assignee: Unassigned
Resolution: Fixed Votes: 0
Labels: None
Environment:

Linux x64, Win32


Attachments: PNG File h3088ato2 _2016-08-19_12-11-49.png     File my.cnf     File my.ini    
Issue Links:
Relates
relates to MDEV-13748 Assertion `status_var.local_memory_us... Closed

 Description   

When doing a "REPLACE INTO table SELECT * FROM..." or "LOAD DATA INFILE ... REPLACE..." on a Aria table with a "text" (or tinytext, mediumtext, longtext) field, replacing data already in the table, used memory increases each time of about the size of data inserted, until server crash with error 1041.
The problem doesn't occours if matching records are deleted before.
Tested also with MyISAM and TokuDB, with which there are no problems.



 Comments   
Comment by Elena Stepanova [ 2016-08-16 ]

Couldn't reproduce it right away, but there are too many variables.
Could you please paste the exact SHOW CREATE TABLE from your scenario, specify how many rows (approximately) you replace by one query, and attach your cnf file(s)?

Comment by Risato Stefano [ 2016-08-19 ]

Maybe the problem occours dependently on the row size. I wrote a stored proc to reproduce the bug. This doesn't occours if you change the second field in the create table statement from TEXT to VARCHAR(4), or if you remove any other field. The three resultsets show the increasing usage of memory after repeated replace intos. I attach the windows my.ini and linux my.cnf files.
Stored procedure content:

BEGIN
 
declare i int;
 
drop table if exists eneltel_info;
CREATE TABLE `eneltel_info` (
	`P3` MEDIUMINT(9) NOT NULL DEFAULT '0',
	`CODICE_ZONA` TEXT NOT NULL DEFAULT '',
	`CFT` CHAR(3) NOT NULL DEFAULT '',
	`ENELTEL` CHAR(9) NOT NULL DEFAULT '',
	`CODICE_PRESA` VARCHAR(13) NOT NULL DEFAULT '',
	`FLAG_TG` VARCHAR(255) NOT NULL DEFAULT '',
	`CODICE_GRUPPO` VARCHAR(255) NOT NULL DEFAULT '',
	`DATA_INSERIMENTO` DATETIME NULL DEFAULT NULL,
	`DATA_MODIFICA` DATETIME NULL DEFAULT NULL,
	`TARIFFARIO` VARCHAR(255) NOT NULL DEFAULT '',
	`CODICE_MIS` VARCHAR(255) NOT NULL DEFAULT '',
	`MATRICOLA_MIS` VARCHAR(255) NOT NULL DEFAULT '',
	`NOMINATIVO` VARCHAR(35) NOT NULL DEFAULT '',
	`VIA` VARCHAR(255) NOT NULL DEFAULT '',
	`NUM_CIV` VARCHAR(255) NOT NULL DEFAULT '',
	`RAPP_1` DECIMAL(5,0) NULL DEFAULT NULL,
	`RAPP_2` DECIMAL(3,0) NULL DEFAULT NULL,
	`STATO_PRESA` VARCHAR(255) NOT NULL DEFAULT '',
	`SOTTOSTATO_PRESA` VARCHAR(255) NOT NULL DEFAULT '',
	`CD_CL_MERCEOLOGICA` DECIMAL(3,0) NULL DEFAULT NULL,
	`POT_DISP` DECIMAL(7,1) NULL DEFAULT NULL,
	`SOM_POT` DECIMAL(7,3) NULL DEFAULT NULL,
	`COST_E` DECIMAL(12,5) NULL DEFAULT NULL,
	`COST_P` DECIMAL(12,3) NULL DEFAULT NULL,
	`DT_CONTRATTO` DATETIME NULL DEFAULT NULL,
	`DT_ALLACCIAMENTO` DATETIME NULL DEFAULT NULL,
	`FLAG_MIS_POT` VARCHAR(255) NOT NULL DEFAULT '',
	`TENSIONE` DECIMAL(6,0) NULL DEFAULT NULL,
	`TENS_FOR` VARCHAR(255) NOT NULL DEFAULT '',
	`FONDO_SCALA` VARCHAR(255) NOT NULL DEFAULT '',
	`MATR_1_TA` VARCHAR(255) NOT NULL DEFAULT '',
	`MATR_2_TA` VARCHAR(255) NOT NULL DEFAULT '',
	`MATR_3_TA` VARCHAR(255) NOT NULL DEFAULT '',
	`MATR_4_TA` VARCHAR(255) NOT NULL DEFAULT '',
	`TIPO_MIS` VARCHAR(255) NOT NULL DEFAULT '',
	`SISTEMA` VARCHAR(255) NOT NULL DEFAULT '',
	`POD` VARCHAR(15) NOT NULL DEFAULT '',
	`COD_TRADER` VARCHAR(255) NOT NULL DEFAULT '',
	`DESC_TRADER` VARCHAR(255) NOT NULL DEFAULT '',
	`SCALA` VARCHAR(255) NOT NULL DEFAULT '',
	`PIANO` VARCHAR(255) NOT NULL DEFAULT '',
	`INTERNO` VARCHAR(255) NOT NULL DEFAULT '',
	`CAP` VARCHAR(255) NOT NULL DEFAULT '',
	`LOCALITA` VARCHAR(25) NOT NULL DEFAULT '',
	`NUM_TEL1` VARCHAR(255) NOT NULL DEFAULT '',
	`NOTE_ACCESSO` VARCHAR(255) NOT NULL DEFAULT '',
	`CODICE_FISCALE` VARCHAR(16) NOT NULL DEFAULT '',
	`PARTITA_IVA` VARCHAR(11) NOT NULL DEFAULT '',
	`COD_U` CHAR(1) NOT NULL DEFAULT '',
	`DT_CES_CONTRATTO` DATETIME NULL DEFAULT NULL,
	`ID_PUNTO_MISURA_RRE` DECIMAL(11,0) NULL DEFAULT NULL,
	`ID_PUNTO_MISURA_LCO` DECIMAL(11,0) NULL DEFAULT NULL,
	`ID_PUNTO_MISURA_2` DECIMAL(11,0) NULL DEFAULT NULL,
	`NU_CIF_A` DECIMAL(1,0) NULL DEFAULT NULL,
	`COD_MAT_A` VARCHAR(255) NOT NULL DEFAULT '',
	`CODICE_MIS_R` VARCHAR(255) NOT NULL DEFAULT '',
	`MATRICOLA_MIS_R` VARCHAR(255) NOT NULL DEFAULT '',
	`NU_CIF_R` DECIMAL(1,0) NULL DEFAULT NULL,
	`COD_MAT_R` VARCHAR(255) NOT NULL DEFAULT '',
	`CODICE_MIS_P` VARCHAR(255) NOT NULL DEFAULT '',
	`MATRICOLA_MIS_P` VARCHAR(255) NOT NULL DEFAULT '',
	`NU_CIF_P` DECIMAL(1,0) NULL DEFAULT NULL,
	`COD_MAT_P` VARCHAR(255) NOT NULL DEFAULT '',
	`GESTORE_RETE` VARCHAR(255) NOT NULL DEFAULT '',
	`FORNITURA_RFI` VARCHAR(255) NOT NULL DEFAULT '',
	`POTENZA_FRANCHIGIA` DECIMAL(9,2) NULL DEFAULT NULL,
	`POT_CONTR_IMPEGNATA` DECIMAL(15,2) NULL DEFAULT NULL,
	`FRAZIONE` VARCHAR(255) NOT NULL DEFAULT '',
	`PROVINCIA` VARCHAR(255) NOT NULL DEFAULT '',
	`NAZIONE` VARCHAR(255) NOT NULL DEFAULT '',
	`TIPO_FORN` VARCHAR(255) NOT NULL DEFAULT '',
	`ID_TIPO_CONTR` VARCHAR(255) NOT NULL DEFAULT '',
	`CONTR_DISPAC` VARCHAR(255) NOT NULL DEFAULT '',
	`DT_FIRMA_CONTR_COMMITT` DATETIME NULL DEFAULT NULL,
	`DT_FIRMA_CONTR_CONTRAE` DATETIME NULL DEFAULT NULL,
	`VIA_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`NUMERO_CIVICO_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`CAP_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`COMUNE_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`FRAZIONE_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`PROVINCIA_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`NAZIONE_ESAZ` VARCHAR(255) NOT NULL DEFAULT '',
	`GEST_RETE_CONNES_SITO` VARCHAR(255) NOT NULL DEFAULT '',
	`PRODUTTORE` VARCHAR(255) NOT NULL DEFAULT '',
	`NON_DISALIMENTABILE` VARCHAR(256) NOT NULL DEFAULT '',
	`PATTI_SPECIALI` VARCHAR(255) NOT NULL DEFAULT '',
	`UBICAZ_APPARECCHI` VARCHAR(255) NOT NULL DEFAULT '',
	`LIMITATORE` VARCHAR(255) NOT NULL DEFAULT '',
	`PORTATA` VARCHAR(255) NOT NULL DEFAULT '',
	`FLAG_MISURA_ENERGIA_ATTIVA` VARCHAR(255) NOT NULL DEFAULT '',
	`FLAG_MISURA_ENERGIA_REATTIVA` VARCHAR(255) NOT NULL DEFAULT '',
	`CIFRE_ATTIVA` DECIMAL(2,0) NULL DEFAULT NULL,
	`CIFRE_REATTIVA` DECIMAL(2,0) NULL DEFAULT NULL,
	`CIFRE_POTENZA` DECIMAL(2,0) NULL DEFAULT NULL,
	`FORNTURE_ORARIE` VARCHAR(255) NOT NULL DEFAULT '',
	`FLAG_FITT` VARCHAR(255) NOT NULL DEFAULT '',
	`TIPO_RIPROGR` DECIMAL(1,0) NULL DEFAULT NULL,
	`TIPO_ALIM_CONTRAT` VARCHAR(255) NOT NULL DEFAULT '',
	`TIPO_MIS_POT` DECIMAL(2,0) NULL DEFAULT NULL,
	`CURVE_CARICO` VARCHAR(255) NOT NULL DEFAULT '',
	`ORE_UTLIZZO` DECIMAL(13,0) NULL DEFAULT NULL,
	`MAGG_PRELIEVI_TENS` DECIMAL(13,0) NULL DEFAULT NULL,
	`COMPONENTE_AUC` VARCHAR(255) NOT NULL DEFAULT '',
	`TIPO_UTENTE` VARCHAR(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`P3`, `ENELTEL`)
) ENGINE=Aria
COLLATE='latin1_swedish_ci'
ROW_FORMAT=DYNAMIC;
 
 
drop table if exists test;
create table test like eneltel_info;
 
set i=0;
while i < 10000 do
	replace into test (p3,eneltel) values (1,i);
	set i=i+1;
end while;
 
show global status like 'Memory_used';
 
set i=0;
while i < 10000 do
	replace into test (p3,eneltel) values (1,i);
	set i=i+1;
end while;
 
show global status like 'Memory_used';
 
set i=0;
while i < 10000 do
	replace into test (p3,eneltel) values (1,i);
	set i=i+1;
end while;
 
show global status like 'Memory_used';
 
END

Comment by Elena Stepanova [ 2016-08-26 ]

Thanks for the report and test case.
Reproducible with current 5.5-10.2.

10.1 also produces the assertion failure upon shutdown:

...
Warning: 16496 bytes lost at 0x7f5c6620d070, allocated by T@3 at maria/ma_dynrec.c:291, maria/ma_update.c:159, maria/ha_maria.cc:2310, sql/handler.cc:5914, sql/sql_insert.c
c:1825, sql/sql_insert.cc:991, sql/sql_parse.cc:3896, sql/sp_head.cc:3215
Warning: 16496 bytes lost at 0x7f5c661e8070, allocated by T@3 at maria/ma_dynrec.c:291, maria/ma_update.c:159, maria/ha_maria.cc:2310, sql/handler.cc:5914, sql/sql_insert.c
c:1825, sql/sql_insert.cc:991, sql/sql_parse.cc:3896, sql/sp_head.cc:3215
Memory lost: 3299200 bytes in 1384 chunks
mysqld: /data/src/10.1/sql/sql_class.cc:1709: virtual THD::~THD(): Assertion `status_var.local_memory_used == 0' failed.
160826 21:04:59 [ERROR] mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
...
#7  0x00007f5c92f03312 in __GI___assert_fail (assertion=0x7f5c960159c0 "status_var.local_memory_used == 0", file=0x7f5c96015730 "/data/src/10.1/sql/sql_class.cc", line=1709, function=0x7f5c960170b0 <THD::~THD()::__PRETTY_FUNCTION__> "virtual THD::~THD()") at assert.c:101
#8  0x00007f5c956c75ff in THD::~THD (this=0x7f5c6f356070, __in_chrg=<optimized out>) at /data/src/10.1/sql/sql_class.cc:1709
#9  0x00007f5c956c77ac in THD::~THD (this=0x7f5c6f356070, __in_chrg=<optimized out>) at /data/src/10.1/sql/sql_class.cc:1714
#10 0x00007f5c9563c707 in unlink_thd (thd=0x7f5c6f356070) at /data/src/10.1/sql/mysqld.cc:2912
#11 0x00007f5c9563ca6a in one_thread_per_connection_end (thd=0x7f5c6f356070, put_in_cache=true) at /data/src/10.1/sql/mysqld.cc:3025
#12 0x00007f5c95839f6a in do_handle_one_connection (thd_arg=0x7f5c6f356070) at /data/src/10.1/sql/sql_connect.cc:1369
#13 0x00007f5c95839ba9 in handle_one_connection (arg=0x7f5c6f356070) at /data/src/10.1/sql/sql_connect.cc:1262
#14 0x00007f5c94e050a4 in start_thread (arg=0x7f5c9663bb00) at pthread_create.c:309
#15 0x00007f5c92fbd87d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

Comment by Alice Sherepa [ 2018-07-18 ]

Still reproducible (10.1 312de43f40e221096b556)

Memory lost: 768 bytes in 3701 chunks
mysqld: 10.1/sql/sql_class.cc:1608: virtual THD::~THD(): Assertion `status_var.local_memory_used == 0' failed.
180718 21:25:05 [ERROR] mysqld got signal 6 ;
 
Server version: 10.1.35-MariaDB-debug
 
stack_bottom = 0x7f107e1bd100 thread_stack 0x48400
mysys/stacktrace.c:267(my_print_stacktrace)[0x55e6a2426454]
sql/signal_handler.cc:168(handle_fatal_signal)[0x55e6a1dbf3dd]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x11390)[0x7f107d291390]
linux/raise.c:54(__GI_raise)[0x7f107c860428]
stdlib/abort.c:91(__GI_abort)[0x7f107c86202a]
assert/assert.c:92(__assert_fail_base)[0x7f107c858bd7]
/lib/x86_64-linux-gnu/libc.so.6(+0x2dc82)[0x7f107c858c82]
sql/sql_class.cc:1610(THD::~THD())[0x55e6a1b3e217]
sql/sql_class.cc:1613(THD::~THD())[0x55e6a1b3e3c4]
sql/mysqld.cc:2840(unlink_thd(THD*))[0x55e6a1ab1daa]
sql/mysqld.cc:2954(one_thread_per_connection_end(THD*, bool))[0x55e6a1ab210e]
sql/sql_connect.cc:1349(do_handle_one_connection(THD*))[0x55e6a1cb67f7]
sql/sql_connect.cc:1243(handle_one_connection)[0x55e6a1cb6448]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7f107d2876ba]
x86_64/clone.S:111(clone)[0x7f107c93241d]

Comment by Elena Stepanova [ 2019-05-01 ]

It seems to have disappeared from current 10.1/10.2, need to bisect to find out when/why.

Comment by Elena Stepanova [ 2020-09-17 ]

The failure disappeared from 5.5 branch after this commit:

commit 2709380587bbcbc7abda77f11ee0abd207c65027
Author: Sergei Golubchik <serg@mariadb.org>
Date:   Wed Feb 14 18:14:24 2018 +0100
 
    MDEV-13748 Assertion `status_var.local_memory_used == 0 || !debug_assert_on_not_freed_memory' failed in virtual THD::~THD after query with INTERSECT
    
    my_safe_alloca()/my_safe_afree() work as alloca() or malloc()/free()
    depending on the memory size to allocate, that is, depending on
    reclength here. They only work correctly if reclength doesn't

Generated at Thu Feb 08 07:43:02 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.