-
Notifications
You must be signed in to change notification settings - Fork 713
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Port Compression: Making empty space reserved dynamic to 5.6
Summary: * segment_reserve_factor determines the ratio of empty pages, the last segment in an ibd can have before innodb creates a new extent. If a new page is needed and the last segment has less than segment_reserve_factor * (current number of pages in this segment) empty pages, then a new extent is created and the new page is allocated from the new extent. The empty pages are useful when B-tree grows so that pages in the upper level of the B-tree can be allocated contiguously. An extent is 64 pages, and a segment is 256 extents. Before this diff, this variable was not configurable and it was determined by 1/x where x was the value defined by the compile time than 1/8th pages were empty, then InnoDB would allocate a new extent leaving many empty pages in the current extent. This caused lots of fragmentation. The ideal value for this variable needs investigation. The current default will have the previous behavior. A segment has 16384 pages, so for eg. If we are okay with leaving at most 16 empty pages per segment, then we can set innodb_segment_reserve_factor=0.001. innodb_segment_reserve_factor.test loads data into two identical tables but sets a lower segment_reserve_factor before loading data to the second table. This makes the second table about 10% smaller than the first table. The default value for this variable is set to 0.01 which should mean 1% of the pages will be allocated for growth. Test Plan: Tested on Jenkins. Reviewers: nizamordulu, jtolmer Reviewed By: tianx (Original Reviewed By: nizamordulu)
- Loading branch information
1 parent
413b034
commit 0fd9494
Showing
9 changed files
with
117 additions
and
12 deletions.
There are no files selected for viewing
19 changes: 19 additions & 0 deletions
19
mysql-test/suite/innodb_stress/r/innodb_segment_reserve_factor.result
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# create the actual table | ||
CREATE TABLE t1( | ||
id INT AUTO_INCREMENT PRIMARY KEY, | ||
msg VARCHAR(255), | ||
KEY msg_i(msg)) | ||
ENGINE=INNODB | ||
ROW_FORMAT=COMPRESSED | ||
KEY_BLOCK_SIZE=8; | ||
# decompress the data file | ||
# t1 is populated with high segment_reserve_factor | ||
SET GLOBAL innodb_segment_reserve_factor = 0.125; | ||
LOAD DATA INFILE 'segment_reserve_factor.dat' INTO TABLE t1; | ||
# t2 is populated with low segment_reserve_factor | ||
SET GLOBAL innodb_segment_reserve_factor = 0.002; | ||
CREATE TABLE t2 like t1; | ||
LOAD DATA INFILE 'segment_reserve_factor.dat' INTO TABLE t2; | ||
# comparing the sizes of t1.ibd and t2.ibd (t2.ibd must be at most 95% of t1.ibd) | ||
'stat -c %s $MYSQLTEST_VARDIR/mysqld.1/data/test/t1.ibd $MYSQLTEST_VARDIR/mysqld.1/data/test/t2.ibd | xargs | awk '{if ($2/$1 < .95) print "PASS"; else print "FAIL";}' | ||
PASS |
2 changes: 2 additions & 0 deletions
2
mysql-test/suite/innodb_stress/t/innodb_segment_reserve_factor-master.opt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
--innodb-file-per-table | ||
--innodb-file-format=Barracuda |
Binary file not shown.
42 changes: 42 additions & 0 deletions
42
mysql-test/suite/innodb_stress/t/innodb_segment_reserve_factor.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
--source include/have_innodb.inc | ||
--disable_query_log | ||
--disable_warnings | ||
DROP TABLE IF EXISTS t1, t2; | ||
--exec rm -f var/mysqld.1/data/test/segment_reserve_factor.dat | ||
--enable_warnings | ||
--let $segment_reserve_factor_save = `SELECT @@innodb_segment_reserve_factor` | ||
--enable_query_log | ||
|
||
--echo # create the actual table | ||
CREATE TABLE t1( | ||
id INT AUTO_INCREMENT PRIMARY KEY, | ||
msg VARCHAR(255), | ||
KEY msg_i(msg)) | ||
ENGINE=INNODB | ||
ROW_FORMAT=COMPRESSED | ||
KEY_BLOCK_SIZE=8; | ||
|
||
--echo # decompress the data file | ||
--exec gunzip -c suite/innodb_stress/t/innodb_segment_reserve_factor.dat.gz > $MYSQLTEST_VARDIR/mysqld.1/data/test/segment_reserve_factor.dat | ||
|
||
--echo # t1 is populated with high segment_reserve_factor | ||
SET GLOBAL innodb_segment_reserve_factor = 0.125; | ||
LOAD DATA INFILE 'segment_reserve_factor.dat' INTO TABLE t1; | ||
|
||
--echo # t2 is populated with low segment_reserve_factor | ||
SET GLOBAL innodb_segment_reserve_factor = 0.002; | ||
CREATE TABLE t2 like t1; | ||
LOAD DATA INFILE 'segment_reserve_factor.dat' INTO TABLE t2; | ||
|
||
--echo # comparing the sizes of t1.ibd and t2.ibd (t2.ibd must be at most 95% of t1.ibd) | ||
|
||
--let $cmd_string = 'stat -c %s \$MYSQLTEST_VARDIR/mysqld.1/data/test/t1.ibd \$MYSQLTEST_VARDIR/mysqld.1/data/test/t2.ibd | xargs | awk '{if (\$2/\$1 < .95) print "PASS"; else print "FAIL";}' | ||
--let $cmd = stat -c %s $MYSQLTEST_VARDIR/mysqld.1/data/test/t1.ibd $MYSQLTEST_VARDIR/mysqld.1/data/test/t2.ibd | xargs | awk '{if (\$2/\$1 < .95) print "PASS"; else print "FAIL";}' | ||
--echo $cmd_string | ||
--exec $cmd | ||
|
||
--disable_query_log | ||
DROP TABLE t1, t2; | ||
eval SET GLOBAL innodb_segment_reserve_factor=$segment_reserve_factor_save; | ||
--exec rm -f $MYSQL_VARDIR/mysqld.1/data/test/segment_reserve_factor.dat | ||
--enable_query_log |
18 changes: 18 additions & 0 deletions
18
mysql-test/suite/sys_vars/r/innodb_segment_reserve_factor_basic.result
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
SET @start_value = @@innodb_segment_reserve_factor; | ||
SELECT @start_value; | ||
@start_value | ||
0.01 | ||
SET GLOBAL innodb_segment_reserve_factor = 0.0; | ||
Warnings: | ||
Warning 1292 Truncated incorrect innodb_segment_reserve_factor value: '0' | ||
SELECT @@innodb_segment_reserve_factor; | ||
@@innodb_segment_reserve_factor | ||
0.000300 | ||
SET GLOBAL innodb_segment_reserve_factor = 0.1; | ||
SELECT @@innodb_segment_reserve_factor; | ||
@@innodb_segment_reserve_factor | ||
0.100000 | ||
SET GLOBAL innodb_segment_reserve_factor = @start_value; | ||
SELECT @@innodb_segment_reserve_factor; | ||
@@innodb_segment_reserve_factor | ||
0.010000 |
13 changes: 13 additions & 0 deletions
13
mysql-test/suite/sys_vars/t/innodb_segment_reserve_factor_basic.test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
--source include/load_sysvars.inc | ||
|
||
|
||
SET @start_value = @@innodb_segment_reserve_factor; | ||
SELECT @start_value; | ||
|
||
SET GLOBAL innodb_segment_reserve_factor = 0.0; | ||
SELECT @@innodb_segment_reserve_factor; | ||
SET GLOBAL innodb_segment_reserve_factor = 0.1; | ||
SELECT @@innodb_segment_reserve_factor; | ||
|
||
SET GLOBAL innodb_segment_reserve_factor = @start_value; | ||
SELECT @@innodb_segment_reserve_factor; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters