[MDEV-487] Statistics: ANALYZE TABLE failure and memory loss warnings after deleting records from a table Created: 2012-08-25  Updated: 2012-08-31  Resolved: 2012-08-31

Status: Closed
Project: MariaDB Server
Component/s: None
Affects Version/s: None
Fix Version/s: 10.0.0

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Igor Babaev
Resolution: Fixed Votes: 0
Labels: None

Issue Links:
Relates

 Description   

With statistics enabled, If I create a table, insert a few records and then delete some, the following ANALYZE TABLE statement fails and memory loss warnings are thrown. The memory leak is for real, if I run a similar test for several minutes, the server ends up with "out of memory".

SET use_stat_tables = PREFERABLY;
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
DELETE FROM t1 WHERE a=1;
ANALYZE TABLE t1;
Table   Op      Msg_type        Msg_text
test.t1 analyze status  Operation failed

Warning: 65536 bytes lost, allocated at mysys/mf_iocache.c:231, mysys/mf_cache.c:69, sql/uniques.cc:98, sql/sql_statistics.cc:1254, sql/sql_statistics.cc:1822, sql/sql_statistics.cc:2038, sql/sql_admin.cc:721, sql/sql_admin.cc:1088
Warning:    3 bytes lost, allocated at mysys/my_malloc.c:137, mysys/mf_cache.c:65, sql/uniques.cc:98, sql/sql_statistics.cc:1254, sql/sql_statistics.cc:1822, sql/sql_statistics.cc:2038, sql/sql_admin.cc:721, sql/sql_admin.cc:1088
Warning:   58 bytes lost, allocated at mysys/my_malloc.c:137, mysys/mf_cache.c:64, sql/uniques.cc:98, sql/sql_statistics.cc:1254, sql/sql_statistics.cc:1822, sql/sql_statistics.cc:2038, sql/sql_admin.cc:721, sql/sql_admin.cc:1088
Warning:  768 bytes lost, allocated at mysys/array.c:65, sql/uniques.cc:95, sql/sql_statistics.cc:1254, sql/sql_statistics.cc:1822, sql/sql_statistics.cc:2038, sql/sql_admin.cc:721, sql/sql_admin.cc:1088, sql/sql_parse.cc:4459
==11324== 103 bytes in 1 blocks are still reachable in loss record 2 of 6
==11324==    at 0x4C26C3A: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==11324==    by 0xCDE66A: sf_malloc (safemalloc.c:105)
==11324==    by 0xCCA9C3: my_malloc (my_malloc.c:41)
==11324==    by 0xCCADDD: my_strdup (my_malloc.c:137)
==11324==    by 0xCAADAA: open_cached_file (mf_cache.c:65)
==11324==    by 0x70A07C: Unique::Unique(int (*)(void*, void const*, void const*), void*, unsigned int, unsigned long long, unsigned int) (uniques.cc:97)
==11324==    by 0x6BE7E6: Count_distinct_field::Count_distinct_field(Field*, unsigned int) (sql_statistics.cc:1254)
==11324==    by 0x6BEE7C: Column_statistics_collected::init(THD*, Field*) (sql_statistics.cc:1822)
==11324==    by 0x6BAECE: collect_statistics_for_table(THD*, TABLE*) (sql_statistics.cc:2038)
==11324==    by 0x73FF42: mysql_admin_table(THD*, TABLE_LIST*, st_ha_check_opt*, char const*, thr_lock_type, bool, bool, unsigned int, int (*)(THD*, TABLE_LIST*, st_ha_check_opt*), int (handler::*)(THD*, st_ha_check_opt*), int (*)(THD*, TABLE_LIST*)) (sql_admin.cc:721)
==11324==    by 0x741357: Analyze_table_statement::execute(THD*) (sql_admin.cc:1088)
==11324==    by 0x636044: mysql_execute_command(THD*) (sql_parse.cc:4459)
==11324==    by 0x63914A: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5736)
==11324==    by 0x62CFCC: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1055)
==11324==    by 0x62C29F: do_command(THD*) (sql_parse.cc:794)
==11324==    by 0x730D04: do_handle_one_connection(THD*) (sql_connect.cc:1253)
==11324== 158 bytes in 1 blocks are still reachable in loss record 3 of 6
==11324==    at 0x4C26C3A: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==11324==    by 0xCDE66A: sf_malloc (safemalloc.c:105)
==11324==    by 0xCCA9C3: my_malloc (my_malloc.c:41)
==11324==    by 0xCCADDD: my_strdup (my_malloc.c:137)
==11324==    by 0xCAAD7B: open_cached_file (mf_cache.c:64)
==11324==    by 0x70A07C: Unique::Unique(int (*)(void*, void const*, void const*), void*, unsigned int, unsigned long long, unsigned int) (uniques.cc:97)
==11324==    by 0x6BE7E6: Count_distinct_field::Count_distinct_field(Field*, unsigned int) (sql_statistics.cc:1254)
==11324==    by 0x6BEE7C: Column_statistics_collected::init(THD*, Field*) (sql_statistics.cc:1822)
==11324==    by 0x6BAECE: collect_statistics_for_table(THD*, TABLE*) (sql_statistics.cc:2038)
==11324==    by 0x73FF42: mysql_admin_table(THD*, TABLE_LIST*, st_ha_check_opt*, char const*, thr_lock_type, bool, bool, unsigned int, int (*)(THD*, TABLE_LIST*, st_ha_check_opt*), int (handler::*)(THD*, st_ha_check_opt*), int (*)(THD*, TABLE_LIST*)) (sql_admin.cc:721)
==11324==    by 0x741357: Analyze_table_statement::execute(THD*) (sql_admin.cc:1088)
==11324==    by 0x636044: mysql_execute_command(THD*) (sql_parse.cc:4459)
==11324==    by 0x63914A: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5736)
==11324==    by 0x62CFCC: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1055)
==11324==    by 0x62C29F: do_command(THD*) (sql_parse.cc:794)
==11324==    by 0x730D04: do_handle_one_connection(THD*) (sql_connect.cc:1253)
==11324== 868 bytes in 1 blocks are still reachable in loss record 5 of 6
==11324==    at 0x4C26C3A: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==11324==    by 0xCDE66A: sf_malloc (safemalloc.c:105)
==11324==    by 0xCCA9C3: my_malloc (my_malloc.c:41)
==11324==    by 0xCA3021: init_dynamic_array2 (array.c:65)
==11324==    by 0x70A011: Unique::Unique(int (*)(void*, void const*, void const*), void*, unsigned int, unsigned long long, unsigned int) (uniques.cc:90)
==11324==    by 0x6BE7E6: Count_distinct_field::Count_distinct_field(Field*, unsigned int) (sql_statistics.cc:1254)
==11324==    by 0x6BEE7C: Column_statistics_collected::init(THD*, Field*) (sql_statistics.cc:1822)
==11324==    by 0x6BAECE: collect_statistics_for_table(THD*, TABLE*) (sql_statistics.cc:2038)
==11324==    by 0x73FF42: mysql_admin_table(THD*, TABLE_LIST*, st_ha_check_opt*, char const*, thr_lock_type, bool, bool, unsigned int, int (*)(THD*, TABLE_LIST*, st_ha_check_opt*), int (handler::*)(THD*, st_ha_check_opt*), int (*)(THD*, TABLE_LIST*)) (sql_admin.cc:721)
==11324==    by 0x741357: Analyze_table_statement::execute(THD*) (sql_admin.cc:1088)
==11324==    by 0x636044: mysql_execute_command(THD*) (sql_parse.cc:4459)
==11324==    by 0x63914A: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5736)
==11324==    by 0x62CFCC: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1055)
==11324==    by 0x62C29F: do_command(THD*) (sql_parse.cc:794)
==11324==    by 0x730D04: do_handle_one_connection(THD*) (sql_connect.cc:1253)
==11324==    by 0x7307C7: handle_one_connection (sql_connect.cc:1168)
==11324== 65,636 bytes in 1 blocks are still reachable in loss record 6 of 6
==11324==    at 0x4C26C3A: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==11324==    by 0xCDE66A: sf_malloc (safemalloc.c:105)
==11324==    by 0xCCA9C3: my_malloc (my_malloc.c:41)
==11324==    by 0xCAC9EB: init_io_cache (mf_iocache.c:231)
==11324==    by 0xCAAE08: open_cached_file (mf_cache.c:69)
==11324==    by 0x70A07C: Unique::Unique(int (*)(void*, void const*, void const*), void*, unsigned int, unsigned long long, unsigned int) (uniques.cc:97)
==11324==    by 0x6BE7E6: Count_distinct_field::Count_distinct_field(Field*, unsigned int) (sql_statistics.cc:1254)
==11324==    by 0x6BEE7C: Column_statistics_collected::init(THD*, Field*) (sql_statistics.cc:1822)
==11324==    by 0x6BAECE: collect_statistics_for_table(THD*, TABLE*) (sql_statistics.cc:2038)
==11324==    by 0x73FF42: mysql_admin_table(THD*, TABLE_LIST*, st_ha_check_opt*, char const*, thr_lock_type, bool, bool, unsigned int, int (*)(THD*, TABLE_LIST*, st_ha_check_opt*), int (handler::*)(THD*, st_ha_check_opt*), int (*)(THD*, TABLE_LIST*)) (sql_admin.cc:721)
==11324==    by 0x741357: Analyze_table_statement::execute(THD*) (sql_admin.cc:1088)
==11324==    by 0x636044: mysql_execute_command(THD*) (sql_parse.cc:4459)
==11324==    by 0x63914A: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:5736)
==11324==    by 0x62CFCC: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1055)
==11324==    by 0x62C29F: do_command(THD*) (sql_parse.cc:794)
==11324==    by 0x730D04: do_handle_one_connection(THD*) (sql_connect.cc:1253)

bzr version-info

revision-id: igor@askmonty.org-20120823182226-tv99ic3pbk5wela9
date: 2012-08-23 11:22:26 -0700
build-date: 2012-08-25 23:23:41 +0300
revno: 3363

As far as I can tell, it started happening since revno 3360 (not reproducible on revno 3359).

Test case:

# Run as perl mysql-test-run.pl --valgrind-mysqld <test name>
 
SET use_stat_tables = PREFERABLY;
 
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
DELETE FROM t1 WHERE a=1;
ANALYZE TABLE t1;
 



 Comments   
Comment by Igor Babaev [ 2012-08-31 ]

The fix was pushed into maria-5.5-mwl248.

Generated at Thu Feb 08 06:29:06 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.