diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-10-21 18:40:26 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-10-21 18:40:26 +0300 |
commit | 193f9df9bc4c353c0c3bd259da8afab545c14130 (patch) | |
tree | 488e115f9a5211ef8528fa2a1a5a14d9672fa3bc | |
parent | 0dfb6e6b41c8763611f64f4f6a7cf22ecd716628 (diff) | |
download | mariadb-git-193f9df9bc4c353c0c3bd259da8afab545c14130.tar.gz |
fixup! d7408f2c6aa5138f2ba68273588d58557b81fa2a
Simplify the waiting
-rw-r--r-- | storage/innobase/buf/buf0flu.cc | 61 | ||||
-rw-r--r-- | storage/innobase/srv/srv0start.cc | 6 |
2 files changed, 27 insertions, 40 deletions
diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 111d17f0409..f4608c3071d 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1534,17 +1534,26 @@ static ulint buf_flush_list(ulint max_n= ULINT_UNDEFINED, lsn_t lsn= LSN_MAX) mysql_mutex_lock(&buf_pool.mutex); mysql_mutex_lock(&buf_pool.flush_list_mutex); - if (buf_pool.flush_list_active || !buf_pool.get_oldest_modification(0)) + if (buf_pool.flush_list_active) { +nothing_to_do: mysql_mutex_unlock(&buf_pool.flush_list_mutex); mysql_mutex_unlock(&buf_pool.mutex); return 0; } - + if (!buf_pool.get_oldest_modification(0)) + { + pthread_cond_broadcast(&buf_pool.done_flush_list); + goto nothing_to_do; + } buf_pool.flush_list_active= true; const ulint n_flushed= buf_do_flush_list_batch(max_n, lsn); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + mysql_mutex_unlock(&buf_pool.mutex); + os_aio_wait_until_no_pending_writes(); + mysql_mutex_lock(&buf_pool.mutex); + mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_pool.flush_list_active= false; - /* Wake up buf_flush_wait() */ pthread_cond_broadcast(&buf_pool.done_flush_list); mysql_mutex_unlock(&buf_pool.flush_list_mutex); @@ -1833,24 +1842,12 @@ static void buf_flush_wait(lsn_t lsn) { if (buf_flush_sync_lsn < lsn) buf_flush_sync_lsn= lsn; - if (buf_pool.flush_list_active) - { - tpool::tpool_wait_begin(); - my_cond_wait(&buf_pool.done_flush_list, - &buf_pool.flush_list_mutex.m_mutex); - tpool::tpool_wait_end(); - } - else - pthread_cond_signal(&buf_pool.do_flush_list); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - os_aio_wait_until_no_pending_writes(); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - } - - /* Wait for the checkpoint. */ - while (buf_flush_sync_lsn) + pthread_cond_signal(&buf_pool.do_flush_list); + tpool::tpool_wait_begin(); my_cond_wait(&buf_pool.done_flush_list, &buf_pool.flush_list_mutex.m_mutex); + tpool::tpool_wait_end(); + } } /** Wait until all persistent pages are flushed up to a limit. @@ -1870,6 +1867,7 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) if (buf_pool.get_oldest_modification(sync_lsn) < sync_lsn) { MONITOR_INC(MONITOR_FLUSH_SYNC_WAITS); + thd_wait_begin(nullptr, THD_WAIT_DISKIO); #if 1 /* FIXME: remove this, and guarantee that the page cleaner serves us */ if (UNIV_UNLIKELY(!buf_page_cleaner_is_active)) { @@ -1883,24 +1881,14 @@ ATTRIBUTE_COLD void buf_flush_wait_flushed(lsn_t sync_lsn) MONITOR_FLUSH_SYNC_COUNT, MONITOR_FLUSH_SYNC_PAGES, n_pages); } - os_aio_wait_until_no_pending_writes(); mysql_mutex_lock(&buf_pool.flush_list_mutex); } while (buf_pool.get_oldest_modification(sync_lsn) < sync_lsn); } else #endif - { - if (buf_flush_sync_lsn < sync_lsn) - { - buf_flush_sync_lsn= sync_lsn; - pthread_cond_signal(&buf_pool.do_flush_list); - } - - thd_wait_begin(nullptr, THD_WAIT_DISKIO); buf_flush_wait(sync_lsn); - thd_wait_end(nullptr); - } + thd_wait_end(nullptr); } mysql_mutex_unlock(&buf_pool.flush_list_mutex); @@ -2011,7 +1999,7 @@ ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn) else if (measure >= buf_flush_async_lsn) buf_flush_async_lsn= 0; - /* wake up buf_flush_wait_flushed() */ + /* wake up buf_flush_wait() */ pthread_cond_broadcast(&buf_pool.done_flush_list); lsn= std::max(lsn, target); @@ -2269,7 +2257,7 @@ furious_flush: if (UNIV_UNLIKELY(lsn_limit != 0)) { buf_flush_sync_lsn= 0; - /* wake up buf_flush_wait_flushed() */ + /* wake up buf_flush_wait() */ pthread_cond_broadcast(&buf_pool.done_flush_list); } unemployed: @@ -2339,8 +2327,6 @@ unemployed: if (UNIV_UNLIKELY(lsn_limit != 0)) { n_flushed= buf_flush_list(srv_max_io_capacity, lsn_limit); - /* wake up buf_flush_wait_flushed() */ - pthread_cond_broadcast(&buf_pool.done_flush_list); goto try_checkpoint; } else if (idle_flush || !srv_adaptive_flushing) @@ -2460,7 +2446,6 @@ ATTRIBUTE_COLD void buf_flush_buffer_pool() { mysql_mutex_unlock(&buf_pool.flush_list_mutex); buf_flush_list(srv_max_io_capacity); - os_aio_wait_until_no_pending_writes(); mysql_mutex_lock(&buf_pool.flush_list_mutex); service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, "Waiting to flush " ULINTPF " pages", @@ -2499,6 +2484,12 @@ void buf_flush_sync() if (lsn == log_sys.get_lsn()) break; } + + /* Wait for the checkpoint. */ + while (buf_flush_sync_lsn) + my_cond_wait(&buf_pool.done_flush_list, + &buf_pool.flush_list_mutex.m_mutex); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); thd_wait_end(nullptr); } diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index d25c8f85074..45e20a57951 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1931,18 +1931,14 @@ void innodb_shutdown() break; case SRV_OPERATION_RESTORE: case SRV_OPERATION_RESTORE_EXPORT: - srv_shutdown_state = SRV_SHUTDOWN_CLEANUP; - if (!buf_page_cleaner_is_active) { - break; - } mysql_mutex_lock(&buf_pool.flush_list_mutex); + srv_shutdown_state = SRV_SHUTDOWN_CLEANUP; while (buf_page_cleaner_is_active) { pthread_cond_signal(&buf_pool.do_flush_list); my_cond_wait(&buf_pool.done_flush_list, &buf_pool.flush_list_mutex.m_mutex); } mysql_mutex_unlock(&buf_pool.flush_list_mutex); - os_aio_wait_until_no_pending_writes(); break; case SRV_OPERATION_NORMAL: /* Shut down the persistent files. */ |