Skip to content

Commit

Permalink
MDEV-8386: MARIADB creates very big tmp file > 351Gb. Started happeni…
Browse files Browse the repository at this point in the history
…ng after Version 10.0.16-15

Fixed small size limit and added additional information if we reserve
new pages more then 50 times.
  • Loading branch information
Jan Lindström committed Jul 14, 2015
1 parent 0a43236 commit a9960ef
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 2 deletions.
45 changes: 45 additions & 0 deletions mysql-test/suite/innodb/r/innodb-alter-table.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
drop database if exists moodle19;
Warnings:
Note 1008 Can't drop database 'moodle19'; database doesn't exist
create database moodle19;
use moodle19;
CREATE TABLE `mdl_course_modules` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`course` bigint(10) NOT NULL DEFAULT '0',
`module` bigint(10) NOT NULL DEFAULT '0',
`instance` bigint(10) NOT NULL DEFAULT '0',
`section` bigint(10) NOT NULL DEFAULT '0',
`idnumber` varchar(100) DEFAULT NULL,
`added` bigint(10) NOT NULL DEFAULT '0',
`delay` varchar(10) NOT NULL DEFAULT '0',
`score` smallint(4) NOT NULL DEFAULT '0',
`indent` mediumint(5) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '1',
`checkboxesforprereqs` tinyint(1) NOT NULL DEFAULT '0',
`stylewhencomplete` varchar(200) DEFAULT '',
`checkboxforcomplete` tinyint(1) NOT NULL DEFAULT '0',
`stylewhenlocked` varchar(200) DEFAULT 'locked',
`visiblewhenlocked` tinyint(1) NOT NULL DEFAULT '1',
`visibleold` tinyint(1) NOT NULL DEFAULT '1',
`groupmode` smallint(4) NOT NULL DEFAULT '0',
`groupingid` bigint(10) NOT NULL DEFAULT '0',
`groupmembersonly` smallint(4) NOT NULL DEFAULT '0',
`completion` tinyint(1) NOT NULL DEFAULT '0',
`completiongradeitemnumber` bigint(10) DEFAULT NULL,
`completionview` tinyint(1) NOT NULL DEFAULT '0',
`completionexpected` bigint(10) NOT NULL DEFAULT '0',
`availablefrom` bigint(10) NOT NULL DEFAULT '0',
`availableuntil` bigint(10) NOT NULL DEFAULT '0',
`showavailability` tinyint(1) NOT NULL DEFAULT '0',
`showdescription` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `mdl_courmodu_vis_ix` (`visible`),
KEY `mdl_courmodu_cou_ix` (`course`),
KEY `mdl_courmodu_mod_ix` (`module`),
KEY `mdl_courmodu_ins_ix` (`instance`),
KEY `mdl_courmodu_idncou_ix` (`idnumber`,`course`),
KEY `mdl_courmodu_gro_ix` (`groupingid`)
) ENGINE=InnoDB AUTO_INCREMENT=447023 DEFAULT CHARSET=utf8 COMMENT='course_modules table retrofitted from MySQL';
# Inserting 2701 rows into the table...
ALTER TABLE moodle19.mdl_course_modules ADD stefantest LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci AFTER showdescription;
drop database moodle19;
59 changes: 59 additions & 0 deletions mysql-test/suite/innodb/t/innodb-alter-table.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
--source include/have_innodb.inc

#
# MMDEV-8386: MariaDB creates very big tmp file and hangs on xtradb
#
drop database if exists moodle19;
create database moodle19;
use moodle19;

CREATE TABLE `mdl_course_modules` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`course` bigint(10) NOT NULL DEFAULT '0',
`module` bigint(10) NOT NULL DEFAULT '0',
`instance` bigint(10) NOT NULL DEFAULT '0',
`section` bigint(10) NOT NULL DEFAULT '0',
`idnumber` varchar(100) DEFAULT NULL,
`added` bigint(10) NOT NULL DEFAULT '0',
`delay` varchar(10) NOT NULL DEFAULT '0',
`score` smallint(4) NOT NULL DEFAULT '0',
`indent` mediumint(5) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '1',
`checkboxesforprereqs` tinyint(1) NOT NULL DEFAULT '0',
`stylewhencomplete` varchar(200) DEFAULT '',
`checkboxforcomplete` tinyint(1) NOT NULL DEFAULT '0',
`stylewhenlocked` varchar(200) DEFAULT 'locked',
`visiblewhenlocked` tinyint(1) NOT NULL DEFAULT '1',
`visibleold` tinyint(1) NOT NULL DEFAULT '1',
`groupmode` smallint(4) NOT NULL DEFAULT '0',
`groupingid` bigint(10) NOT NULL DEFAULT '0',
`groupmembersonly` smallint(4) NOT NULL DEFAULT '0',
`completion` tinyint(1) NOT NULL DEFAULT '0',
`completiongradeitemnumber` bigint(10) DEFAULT NULL,
`completionview` tinyint(1) NOT NULL DEFAULT '0',
`completionexpected` bigint(10) NOT NULL DEFAULT '0',
`availablefrom` bigint(10) NOT NULL DEFAULT '0',
`availableuntil` bigint(10) NOT NULL DEFAULT '0',
`showavailability` tinyint(1) NOT NULL DEFAULT '0',
`showdescription` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `mdl_courmodu_vis_ix` (`visible`),
KEY `mdl_courmodu_cou_ix` (`course`),
KEY `mdl_courmodu_mod_ix` (`module`),
KEY `mdl_courmodu_ins_ix` (`instance`),
KEY `mdl_courmodu_idncou_ix` (`idnumber`,`course`),
KEY `mdl_courmodu_gro_ix` (`groupingid`)
) ENGINE=InnoDB AUTO_INCREMENT=447023 DEFAULT CHARSET=utf8 COMMENT='course_modules table retrofitted from MySQL';

let $num= 2701;
--disable_query_log
--echo # Inserting $num rows into the table...
while ($num)
{
eval INSERT INTO mdl_course_modules VALUES ($num,4,5,5,24,NULL,1141569781,'',0,0,1,0,'',0,'locked',1,1,0,0,0,0,NULL,0,0,0,0,0,0);
dec $num;
}
--enable_query_log
ALTER TABLE moodle19.mdl_course_modules ADD stefantest LONGTEXT CHARACTER SET utf8 COLLATE utf8_general_ci AFTER showdescription;

drop database moodle19;
14 changes: 14 additions & 0 deletions storage/innobase/fsp/fsp0fsp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2715,6 +2715,8 @@ fsp_reserve_free_extents(
ulint reserve;
ibool success;
ulint n_pages_added;
size_t total_reserved = 0;
ulint rounds = 0;

ut_ad(mtr);
*n_reserved = n_ext;
Expand Down Expand Up @@ -2783,15 +2785,27 @@ fsp_reserve_free_extents(
}

success = fil_space_reserve_free_extents(space, n_free, n_ext);
*n_reserved = n_ext;

if (success) {
return(TRUE);
}
try_to_extend:
success = fsp_try_extend_data_file(&n_pages_added, space,
space_header, mtr);

if (success && n_pages_added > 0) {

rounds++;
total_reserved += n_pages_added;

if (rounds > 50) {
ib_logf(IB_LOG_LEVEL_INFO,
"Space id %lu trying to reserve %lu extents actually reserved %lu "
" reserve %lu free %lu size %lu rounds %lu total_reserved %lu",
space, n_ext, n_pages_added, reserve, n_free, size, rounds, total_reserved);
}

goto try_again;
}

Expand Down
16 changes: 14 additions & 2 deletions storage/xtradb/fsp/fsp0fsp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2724,6 +2724,8 @@ fsp_reserve_free_extents(
ulint reserve;
ibool success;
ulint n_pages_added;
size_t total_reserved = 0;
ulint rounds = 0;

ut_ad(mtr);
*n_reserved = n_ext;
Expand All @@ -2737,7 +2739,7 @@ fsp_reserve_free_extents(
try_again:
size = mtr_read_ulint(space_header + FSP_SIZE, MLOG_4BYTES, mtr);

if (size < FSP_EXTENT_SIZE) {
if (size < FSP_EXTENT_SIZE / 2) {
/* Use different rules for small single-table tablespaces */
*n_reserved = 0;
return(fsp_reserve_free_pages(space, space_header, size, mtr));
Expand All @@ -2752,7 +2754,6 @@ fsp_reserve_free_extents(
some of them will contain extent descriptor pages, and therefore
will not be free extents */

ut_ad(size >= free_limit);
n_free_up = (size - free_limit) / FSP_EXTENT_SIZE;

if (n_free_up > 0) {
Expand Down Expand Up @@ -2793,6 +2794,7 @@ fsp_reserve_free_extents(
}

success = fil_space_reserve_free_extents(space, n_free, n_ext);
*n_reserved = n_ext;

if (success) {
return(TRUE);
Expand All @@ -2802,6 +2804,16 @@ fsp_reserve_free_extents(
space_header, mtr);
if (success && n_pages_added > 0) {

rounds++;
total_reserved += n_pages_added;

if (rounds > 50) {
ib_logf(IB_LOG_LEVEL_INFO,
"Space id %lu trying to reserve %lu extents actually reserved %lu "
" reserve %lu free %lu size %lu rounds %lu total_reserved %lu",
space, n_ext, n_pages_added, reserve, n_free, size, rounds, total_reserved);
}

goto try_again;
}

Expand Down

0 comments on commit a9960ef

Please sign in to comment.