diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-11-26 07:36:53 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-11-26 07:36:53 +0200 |
commit | 8b8969929d741aac667dcd1780c2264785c8a114 (patch) | |
tree | d239edad28ac404ed780b3f1b81ca466daed551c /storage/innobase/buf | |
parent | 581aebe29f19aaf767ba5f0ac69f8f199eb80dff (diff) | |
parent | 657fcdf430f39a3103dff51a6a2b2bd3a090a498 (diff) | |
download | mariadb-git-bb-10.3-mdev21265.tar.gz |
Merge 10.5 into 10.6bb-10.3-mdev2126510.3-mdev21265
Diffstat (limited to 'storage/innobase/buf')
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 33 | ||||
-rw-r--r-- | storage/innobase/buf/buf0lru.cc | 7 |
2 files changed, 33 insertions, 7 deletions
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 316c1822f0b..dc7ae3af70e 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -126,6 +126,20 @@ static void buf_flush_validate_skip() } #endif /* UNIV_DEBUG */ +/** 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)))) + { + page_cleaner_is_idle= false; + mysql_cond_signal(&do_flush_list); + } +} + /** Insert a modified block into the flush list. @param[in,out] block modified block @param[in] lsn oldest modification */ @@ -145,6 +159,7 @@ void buf_flush_insert_into_flush_list(buf_block_t* block, lsn_t lsn) UT_LIST_ADD_FIRST(buf_pool.flush_list, &block->page); ut_d(buf_flush_validate_skip()); + buf_pool.page_cleaner_wakeup(); mysql_mutex_unlock(&buf_pool.flush_list_mutex); } @@ -2067,8 +2082,12 @@ furious_flush: else if (srv_shutdown_state > SRV_SHUTDOWN_INITIATED) break; - mysql_cond_timedwait(&buf_pool.do_flush_list, &buf_pool.flush_list_mutex, - &abstime); + if (buf_pool.page_cleaner_idle()) + mysql_cond_wait(&buf_pool.do_flush_list, &buf_pool.flush_list_mutex); + else + mysql_cond_timedwait(&buf_pool.do_flush_list, &buf_pool.flush_list_mutex, + &abstime); + set_timespec(abstime, 1); lsn_limit= buf_flush_sync_lsn; @@ -2091,6 +2110,8 @@ furious_flush: /* wake up buf_flush_wait_flushed() */ mysql_cond_broadcast(&buf_pool.done_flush_list); } +unemployed: + buf_pool.page_cleaner_set_idle(true); continue; } @@ -2101,13 +2122,14 @@ furious_flush: 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) - continue; + goto unemployed; const lsn_t oldest_lsn= buf_pool.get_oldest_modification(0); if (UNIV_UNLIKELY(lsn_limit != 0) && oldest_lsn >= lsn_limit) buf_flush_sync_lsn= 0; + buf_pool.page_cleaner_set_idle(false); mysql_mutex_unlock(&buf_pool.flush_list_mutex); ulint n_flushed; @@ -2159,6 +2181,11 @@ do_checkpoint: goto do_checkpoint; } } + else + { + mysql_mutex_lock(&buf_pool.flush_list_mutex); + goto unemployed; + } #ifdef UNIV_DEBUG while (innodb_page_cleaner_disabled_debug && !buf_flush_sync_lsn && diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index f9ed938b20c..37a4ec9849c 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -76,13 +76,12 @@ uncompressed and compressed data), which must be clean. */ /* @{ */ /** Number of intervals for which we keep the history of these stats. -Each interval is 1 second, defined by the rate at which -srv_error_monitor_thread() calls buf_LRU_stat_update(). */ -static const ulint BUF_LRU_STAT_N_INTERVAL = 50; +Updated at SRV_MONITOR_INTERVAL (the buf_LRU_stat_update() call rate). */ +static constexpr ulint BUF_LRU_STAT_N_INTERVAL= 4; /** Co-efficient with which we multiply I/O operations to equate them with page_zip_decompress() operations. */ -static const ulint BUF_LRU_IO_TO_UNZIP_FACTOR = 50; +static constexpr ulint BUF_LRU_IO_TO_UNZIP_FACTOR= 50; /** Sampled values buf_LRU_stat_cur. Not protected by any mutex. Updated by buf_LRU_stat_update(). */ |