Uploaded image for project: 'MariaDB Server'
  1. MDEV-487

Statistics: ANALYZE TABLE failure and memory loss warnings after deleting records from a table

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects versions: None
    • Fix versions: 10.0.0
    • Components: None
    • Labels:
      None
    • Sprint:

      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;
      
      

        Attachments

          Activity

            People

            • Assignee:
              igor Igor Babaev
              Reporter:
              elenst Elena Stepanova
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: