summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-10-21 18:40:26 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-10-21 18:40:26 +0300
commit193f9df9bc4c353c0c3bd259da8afab545c14130 (patch)
tree488e115f9a5211ef8528fa2a1a5a14d9672fa3bc
parent0dfb6e6b41c8763611f64f4f6a7cf22ecd716628 (diff)
downloadmariadb-git-193f9df9bc4c353c0c3bd259da8afab545c14130.tar.gz
fixup! d7408f2c6aa5138f2ba68273588d58557b81fa2a
Simplify the waiting
-rw-r--r--storage/innobase/buf/buf0flu.cc61
-rw-r--r--storage/innobase/srv/srv0start.cc6
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. */