mirror of
https://github.com/MariaDB/server.git
synced 2025-07-20 18:28:14 +02:00

We deprecate and ignore the parameter innodb_buffer_pool_chunk_size and let the buffer pool size to be changed in arbitrary 1-megabyte increments, all the way up to innodb_buffer_pool_size_max, which must be specified at startup. If innodb_buffer_pool_size_max is not specified, it will default to twice the specified innodb_buffer_pool_size. The buffer pool will be mapped in a contiguous memory area that will be aligned and partitioned into extents of 8 MiB on 64-bit systems and 2 MiB on 32-bit systems. Within an extent, the first few innodb_page_size blocks contain buf_block_t objects that will cover the page frames in the rest of the extent. In this way, there is a trivial mapping between page frames and block descriptors and we do not need any lookup tables like buf_pool.zip_hash or buf_pool_t::chunk_t::map. We will always allocate the same number of block descriptors for an extent, even if we do not need all the buf_block_t in the last extent in case the innodb_buffer_pool_size is not an integer multiple of the of extents size. The minimum innodb_buffer_pool_size is 256*5/4 pages. At the default innodb_page_size=16k this corresponds to 5 MiB. However, now that the innodb_buffer_pool_size includes the memory allocated for the block descriptors, the minimum would be innodb_buffer_pool_size=6m. Innodb_buffer_pool_resize_status: Remove. We will execute buf_pool_t::resize() synchronously in the thread that is executing SET GLOBAL innodb_buffer_pool_size. That operation will run until it completes, or until a KILL statement is executed, the client is disconnected, the buf_flush_page_cleaner() thread notices that we are running out of memory, or the server is shut down. my_large_virtual_alloc(): A new function, similar to my_large_malloc(). FIXME: On Microsoft Windows, let the caller know if large page allocation was used. In that case, we must disallow buffer pool resizing. buf_pool_t::create(), buf_pool_t::chunk_t::create(): Only initialize the first page descriptor of each chunk. buf_pool_t::lazy_allocate(): Lazily initialize a previously allocated page descriptor and increase buf_pool.n_blocks, which must be below buf_pool.n_blocks_alloc. buf_pool_t::allocate(): Renamed from buf_LRU_get_free_only(). buf_pool_t::LRU_warned: Changed to Atomic_relaxed<bool>, only to be modified by the buf_flush_page_cleaner() thread. buf_pool_t::LRU_shrink(): Check if buffer pool shrinking needs to process a buffer page. buf_pool_t::resize(): Always zero out b->page.zip.data. Failure to do so would cause crashes or corruption in the test innodb.innodb_buffer_pool_resize due to duplicated allocation in the buddy system. Before tarting to shrink the buffer pool, run one batch of buf_flush_page_cleaner() in order to prevent LRU_warn(). Abort shrinking if the buf_flush_page_cleaner() has LRU_warned. buf_pool_t::first_to_withdraw: The first block descriptor that is out of the bounds of the shrunk buffer pool. buf_pool_t::withdrawn: The list of withdrawn blocks. If buf_pool_t::resize() is aborted, we must be able to resurrect the withdrawn blocks in the free list. buf_pool_t::contains_zip(): Added a parameter for the number of least significant pointer bits to disregard, so that we can find any pointers to within a block that is supposed to be free. buf_pool_t::get_info(): Replaces buf_stats_get_pool_info(). innodb_init_param(): Refactored. We must first compute srv_page_size_shift and then determine the valid bounds of innodb_buffer_pool_size. buf_buddy_shrink(): Replaces buf_buddy_realloc(). Part of the work is deferred to buf_buddy_condense_free(), which is being executed when we are not holding any buf_pool.page_hash latch. buf_buddy_condense_free(): Do not relocate blocks. buf_buddy_free_low(): Do not care about buffer pool shrinking. This will be handled by buf_buddy_shrink() and buf_buddy_condense_free(). buf_buddy_alloc_zip(): Assert !buf_pool.contains_zip() when we are allocating from the binary buddy system. Previously we were asserting this on multiple recursion levels. buf_buddy_block_free(), buf_buddy_free_low(): Assert !buf_pool.contains_zip(). buf_buddy_alloc_from(): Remove the redundant parameter j. buf_flush_LRU_list_batch(): Add the parameter shrinking. If we are shrinking, invoke buf_pool_t::LRU_shrink() to see if we must keep going. buf_do_LRU_batch(): Skip buf_free_from_unzip_LRU_list_batch() if we are shrinking the buffer pool. In that case, we want to minimize the page relocations and just finish as quickly as possible. trx_purge_attach_undo_recs(): Limit purge_sys.n_pages_handled() in every iteration, in case the buffer pool is being shrunk in the middle of a purge batch.
56 lines
1.8 KiB
Text
56 lines
1.8 KiB
Text
--source include/have_innodb.inc
|
|
--source include/big_test.inc
|
|
--source include/have_sequence.inc
|
|
--source include/maybe_debug.inc
|
|
call mtr.add_suppression("InnoDB: The change buffer is corrupted");
|
|
call mtr.add_suppression("InnoDB: Plugin initialization aborted at srv0start.cc");
|
|
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
|
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
|
|
CREATE TABLE t1(c TEXT, KEY(c(3072)))ENGINE=InnoDB;
|
|
DELIMITER |;
|
|
|
|
CREATE PROCEDURE dorepeat()
|
|
LOOP
|
|
INSERT INTO t1 VALUES ('abc');
|
|
UPDATE t1 SET c='cba';
|
|
END LOOP
|
|
|
|
|
|
|
DELIMITER ;|
|
|
connect(con1,localhost,root,,,);
|
|
send CALL dorepeat();
|
|
connection default;
|
|
sleep 10;
|
|
let $shutdown_timeout=0;
|
|
let $restart_parameters=--innodb_buffer_pool_size=6m;
|
|
--source include/restart_mysqld.inc
|
|
DROP TABLE t1;
|
|
DROP PROCEDURE dorepeat;
|
|
|
|
--echo #
|
|
--echo # MDEV-30552 InnoDB recovery crashes when error
|
|
--echo # handling scenario
|
|
--echo #
|
|
if ($have_debug) {
|
|
SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard";
|
|
let $restart_parameters=--innodb_buffer_pool_size=6m --debug_dbug=+d,ibuf_init_corrupt;
|
|
}
|
|
if (!$have_debug) {
|
|
--echo SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard";
|
|
let $restart_parameters=--innodb_buffer_pool_size=6m;
|
|
}
|
|
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
|
INSERT INTO t1 SELECT * FROM seq_1_to_65536;
|
|
let $restart_noprint=1;
|
|
let $shutdown_timeout=0;
|
|
--source include/restart_mysqld.inc
|
|
if ($have_debug) {
|
|
let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|
let SEARCH_PATTERN=\[ERROR\] InnoDB: The change buffer is corrupted or has been removed on upgrade to MariaDB 11.0 or later;
|
|
--source include/search_pattern_in_file.inc
|
|
}
|
|
let $restart_noprint=0;
|
|
let $restart_parameters=;
|
|
--source include/restart_mysqld.inc
|
|
SHOW CREATE TABLE t1;
|
|
DROP TABLE t1;
|