MDEV-34256 InnoDB throws out of bound write due to temporary

		tablespace truncation

- InnoDB fails with out of bound write error after temporary
tablespace truncation. This issue caused by
commit c507678b (MDEV-28699).
InnoDB fail to clear freed ranges if shrinking size
is the last offset of the freed range.
parent 45794870
set @old_innodb_buffer_pool_size = @@innodb_buffer_pool_size;
set @old_immediate_scrub_data_val= @@innodb_immediate_scrub_data_uncompressed;
SET GLOBAL innodb_immediate_scrub_data_uncompressed=1;
SET GLOBAL innodb_buffer_pool_size= 16777216;
CREATE TEMPORARY TABLE t1(c1 MEDIUMTEXT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (repeat(1,16777215));
DROP TEMPORARY TABLE t1;
SET GLOBAL innodb_truncate_temporary_tablespace_now=1;
SET GLOBAL innodb_buffer_pool_size=10485760;
set global innodb_buffer_pool_size = @old_innodb_buffer_pool_size;
set global innodb_immediate_scrub_data_uncompressed = @old_immediate_scrub_data_val;
--source include/have_innodb.inc
set @old_innodb_buffer_pool_size = @@innodb_buffer_pool_size;
set @old_immediate_scrub_data_val= @@innodb_immediate_scrub_data_uncompressed;
SET GLOBAL innodb_immediate_scrub_data_uncompressed=1;
SET GLOBAL innodb_buffer_pool_size= 16777216;
CREATE TEMPORARY TABLE t1(c1 MEDIUMTEXT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (repeat(1,16777215));
DROP TEMPORARY TABLE t1;
SET GLOBAL innodb_truncate_temporary_tablespace_now=1;
let $wait_timeout = 180;
let $wait_condition =
SELECT SUBSTR(variable_value, 1, 30) = 'Completed resizing buffer pool'
FROM information_schema.global_status
WHERE LOWER(variable_name) = 'innodb_buffer_pool_resize_status';
SET GLOBAL innodb_buffer_pool_size=10485760;
--source include/wait_condition.inc
set global innodb_buffer_pool_size = @old_innodb_buffer_pool_size;
set global innodb_immediate_scrub_data_uncompressed = @old_immediate_scrub_data_val;
--source include/wait_condition.inc
......@@ -3714,7 +3714,7 @@ inline void fil_space_t::clear_freed_ranges(uint32_t threshold)
{
if (range.first >= threshold)
continue;
else if (range.last > threshold)
else if (range.last >= threshold)
{
range_t new_range{range.first, threshold - 1};
current_ranges.add_range(new_range);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment