diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 217976e637c..b8cdf4cd9db 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -4,7 +4,7 @@ MariaBackup: hot backup tool for InnoDB Originally Created 3/3/2009 Yasufumi Kinoshita Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. -(c) 2017, 2020, MariaDB Corporation. +(c) 2017, 2021, MariaDB Corporation. Portions written by Marko Mäkelä. This program is free software; you can redistribute it and/or modify @@ -2183,6 +2183,14 @@ error: static bool innodb_init() { bool create_new_db = false; + + if (srv_io_capacity >= SRV_MAX_IO_CAPACITY_LIMIT / 2) { + /* Avoid overflow. */ + srv_max_io_capacity = SRV_MAX_IO_CAPACITY_LIMIT; + } else { + srv_max_io_capacity = std::max(2 * srv_io_capacity, 2000UL); + } + /* Check if the data files exist or not. */ dberr_t err = srv_sys_space.check_file_spec(&create_new_db, 5U << 20); diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 591471cbbff..2a7d7b9a246 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -1322,7 +1322,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0.000000 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE DOUBLE -VARIABLE_COMMENT Percentage of dirty pages at which flushing kicks in. +VARIABLE_COMMENT Percentage of dirty pages at which flushing kicks in. The value 0 (default) means 'refer to innodb_max_dirty_pages_pct'. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 99.999 NUMERIC_BLOCK_SIZE NULL diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 81095a6d0d2..934feadb437 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2020, MariaDB Corporation. +Copyright (c) 2013, 2021, MariaDB Corporation. Copyright (c) 2013, 2014, Fusion-io This program is free software; you can redistribute it and/or modify it under @@ -129,11 +129,13 @@ static void buf_flush_validate_skip() /** Wake up the page cleaner if needed */ inline void buf_pool_t::page_cleaner_wakeup() { - if (page_cleaner_idle() && - (srv_max_dirty_pages_pct_lwm == 0.0 || - srv_max_dirty_pages_pct_lwm <= - double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 / - double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)))) + if (!page_cleaner_idle()) + return; + double dirty_pct= double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 / + double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)); + double pct_lwm= srv_max_dirty_pages_pct_lwm; + if ((pct_lwm != 0.0 && pct_lwm <= dirty_pct) || + srv_max_buf_pool_modified_pct <= dirty_pct) { page_cleaner_is_idle= false; mysql_cond_signal(&do_flush_list); @@ -1989,7 +1991,9 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, sum_pages = 0; } - const ulint pct_for_dirty = static_cast + const ulint pct_for_dirty = srv_max_dirty_pages_pct_lwm == 0 + ? (dirty_pct >= max_pct ? 100 : 0) + : static_cast (max_pct > 0.0 ? dirty_pct / max_pct : dirty_pct); ulint pct_total = std::max(pct_for_dirty, pct_for_lsn); @@ -2129,7 +2133,11 @@ unemployed: const double dirty_pct= double(dirty_blocks) * 100.0 / double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free)); - if (dirty_pct < srv_max_dirty_pages_pct_lwm && !lsn_limit) + if (lsn_limit); + else if (dirty_pct < srv_max_buf_pool_modified_pct) + goto unemployed; + else if (srv_max_dirty_pages_pct_lwm == 0.0 || + dirty_pct < srv_max_dirty_pages_pct_lwm) goto unemployed; const lsn_t oldest_lsn= buf_pool.get_oldest_modified() diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 227b63674b9..92cfd81e97b 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -19032,7 +19032,8 @@ static MYSQL_SYSVAR_DOUBLE(max_dirty_pages_pct, srv_max_buf_pool_modified_pct, static MYSQL_SYSVAR_DOUBLE(max_dirty_pages_pct_lwm, srv_max_dirty_pages_pct_lwm, PLUGIN_VAR_RQCMDARG, - "Percentage of dirty pages at which flushing kicks in.", + "Percentage of dirty pages at which flushing kicks in. " + "The value 0 (default) means 'refer to innodb_max_dirty_pages_pct'.", NULL, innodb_max_dirty_pages_pct_lwm_update, 0, 0, 99.999, 0); static MYSQL_SYSVAR_DOUBLE(adaptive_flushing_lwm, diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 7c90c7f8864..adb679dfa3c 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -3,7 +3,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, 2009, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2020, MariaDB Corporation. +Copyright (c) 2013, 2021, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -373,7 +373,7 @@ extern ulong srv_innodb_stats_method; extern ulint srv_max_n_open_files; -extern double srv_max_dirty_pages_pct; +extern double srv_max_buf_pool_modified_pct; extern double srv_max_dirty_pages_pct_lwm; extern double srv_adaptive_flushing_lwm; @@ -400,10 +400,8 @@ extern my_bool srv_stats_sample_traditional; extern my_bool srv_use_doublewrite_buf; extern ulong srv_checksum_algorithm; -extern double srv_max_buf_pool_modified_pct; extern my_bool srv_force_primary_key; -extern double srv_max_buf_pool_modified_pct; extern ulong srv_max_purge_lag; extern ulong srv_max_purge_lag_delay;