Commit 6dfd44c8 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-25954: Trim os_aio_wait_until_no_pending_writes()

It turns out that we had some unnecessary waits for no outstanding
write requests to exist. They were basically working around a
bug that was fixed in MDEV-25953.

On write completion callback, blocks will be marked clean.
So, it is sufficient to consult buf_pool.flush_list to determine
which writes have not been completed yet.

On FLUSH TABLES...FOR EXPORT we must still wait for all pending
asynchronous writes to complete, because buf_flush_file_space()
would merely guarantee that writes will have been initiated.
parent 344e5990
...@@ -689,7 +689,6 @@ void buf_dblwr_t::flush_buffered_writes() ...@@ -689,7 +689,6 @@ void buf_dblwr_t::flush_buffered_writes()
{ {
if (!is_initialised() || !srv_use_doublewrite_buf) if (!is_initialised() || !srv_use_doublewrite_buf)
{ {
os_aio_wait_until_no_pending_writes();
fil_flush_file_spaces(); fil_flush_file_spaces();
return; return;
} }
......
...@@ -1546,11 +1546,6 @@ static std::atomic_flag log_flush_pending; ...@@ -1546,11 +1546,6 @@ static std::atomic_flag log_flush_pending;
/** Advance log_sys.get_flushed_lsn() */ /** Advance log_sys.get_flushed_lsn() */
static void log_flush(void *) static void log_flush(void *)
{ {
/* Between batches, we try to prevent I/O stalls by these calls.
This should not be needed for correctness. */
os_aio_wait_until_no_pending_writes();
fil_flush_file_spaces();
/* Guarantee progress for buf_flush_lists(). */ /* Guarantee progress for buf_flush_lists(). */
log_buffer_flush_to_disk(true); log_buffer_flush_to_disk(true);
log_flush_pending.clear(); log_flush_pending.clear();
......
...@@ -1743,8 +1743,6 @@ void fil_close_tablespace(ulint id) ...@@ -1743,8 +1743,6 @@ void fil_close_tablespace(ulint id)
Thus we can clean the tablespace out of buf_pool Thus we can clean the tablespace out of buf_pool
completely and permanently. */ completely and permanently. */
while (buf_flush_dirty_pages(id)); while (buf_flush_dirty_pages(id));
/* Ensure that all asynchronous IO is completed. */
os_aio_wait_until_no_pending_writes();
ut_ad(space->is_stopping()); ut_ad(space->is_stopping());
/* If the free is successful, the X lock will be released before /* If the free is successful, the X lock will be released before
......
...@@ -1111,10 +1111,9 @@ void os_aio_free(); ...@@ -1111,10 +1111,9 @@ void os_aio_free();
@retval DB_IO_ERROR on I/O error */ @retval DB_IO_ERROR on I/O error */
dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n); dberr_t os_aio(const IORequest &type, void *buf, os_offset_t offset, size_t n);
/** Waits until there are no pending writes in os_aio_write_array. There can /** Wait until there are no pending asynchronous writes.
be other, synchronous, pending writes. */ Only used on FLUSH TABLES...FOR EXPORT. */
void void os_aio_wait_until_no_pending_writes();
os_aio_wait_until_no_pending_writes();
/** Prints info of the aio arrays. /** Prints info of the aio arrays.
......
...@@ -3788,8 +3788,8 @@ static void os_aio_wait_until_no_pending_writes_low() ...@@ -3788,8 +3788,8 @@ static void os_aio_wait_until_no_pending_writes_low()
tpool::tpool_wait_end(); tpool::tpool_wait_end();
} }
/** Waits until there are no pending writes. There can /** Wait until there are no pending asynchronous writes.
be other, synchronous, pending writes. */ Only used on FLUSH TABLES...FOR EXPORT. */
void os_aio_wait_until_no_pending_writes() void os_aio_wait_until_no_pending_writes()
{ {
os_aio_wait_until_no_pending_writes_low(); os_aio_wait_until_no_pending_writes_low();
......
...@@ -4234,6 +4234,16 @@ row_import_for_mysql( ...@@ -4234,6 +4234,16 @@ row_import_for_mysql(
of delete marked records that couldn't be purged in Phase I. */ of delete marked records that couldn't be purged in Phase I. */
while (buf_flush_dirty_pages(prebuilt->table->space_id)); while (buf_flush_dirty_pages(prebuilt->table->space_id));
for (ulint count = 0; prebuilt->table->space->referenced(); count++) {
/* Issue a warning every 10.24 seconds, starting after
2.56 seconds */
if ((count & 511) == 128) {
ib::warn() << "Waiting for flush to complete on "
<< prebuilt->table->name;
}
os_thread_sleep(20000);
}
ib::info() << "Phase IV - Flush complete"; ib::info() << "Phase IV - Flush complete";
prebuilt->table->space->set_imported(); prebuilt->table->space->set_imported();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment