[MDEV-13818] CREATE INDEX leaks memory if running out of undo log space Created: 2017-09-15  Updated: 2019-03-08  Resolved: 2019-03-06

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB, Storage Engine - XtraDB
Affects Version/s: 10.0, 10.1, 10.2, 10.3
Fix Version/s: 10.2.23, 10.1.39, 10.3.14, 10.4.4

Type: Bug Priority: Major
Reporter: Marko Mäkelä Assignee: Marko Mäkelä
Resolution: Fixed Votes: 0
Labels: ddl, online-ddl

Issue Links:
Relates
relates to MDEV-13626 Merge InnoDB test cases from MySQL 5.7 Closed
Sprint: 10.3.6-1

 Description   

The test innodb.alter_crash fails due to a memory leak.
The reduced test case is as follows:

--source include/not_embedded.inc
--source include/have_innodb.inc
--source include/have_debug.inc
CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
SET DEBUG_DBUG='+d,ib_create_table_fail_too_many_trx';
--error ER_TOO_MANY_CONCURRENT_TRXS
CREATE INDEX c1 ON t1 (c1);
--source include/restart_mysqld.inc
DROP TABLE t1;

The leak occurs when row_merge_create_index_graph() returns an error to row_merge_create_index(). The injected error is triggered when a SYS_INDEXES record is about to be inserted for the created index.

The error cannot be reproduced on MariaDB 10.0 or 10.1. A possible reason is that the code may have been refactored in WL#6501 TRUNCATE TABLE in MySQL 5.7.



 Comments   
Comment by Thirunarayanan Balathandayuthapani [ 2018-02-28 ]

Memory leaks happens during addition of index in alter table.

Three operations happens in row_merge_create_index in 10.2 or create_dict_index (10.3)

(1) Insert the index entry in SYS_INDEXES system table.
(2) Insert the field entry in SYS_FIELDS system table.
(3) Create the b-tree for index and stores the root page number in SYS_INDEXES field.

Between (2) and (3), InnoDB adds the index into table cache. It checks whether
the index entry exceeds the half of the page. (dict_index_add_to_cache_w_vcol())

If any error happens during (1) and (2) then InnoDB doesn't free the heap memory
of an index. Luckily dict_index_add_to_cache_w_vcol() does free the heap memory
of an index irrespective of results.

Comment by Marko Mäkelä [ 2019-03-07 ]

The memory leak is present also in MariaDB 10.0 and 10.1, possibly also 5.5. The test innodb.alter_crash was missing from 10.0 and 10.1. I ported it to 10.1 and plugged the memory leak in 10.1.39.

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