summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-10-13 10:38:41 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-10-13 10:38:41 +0300
commit2bb8d7c2f36439ab6a3944476665eb1218c36f5c (patch)
tree28859c0b15306e2e4c71851772aeeaf87eae012c
parent6f32b28be511e96d9265ce727aa4a38810b41f96 (diff)
downloadmariadb-git-2bb8d7c2f36439ab6a3944476665eb1218c36f5c.tar.gz
MDEV-26811: Assertion "log_sys->n_pending_flushes == 1" fails
In commit 1cb218c37cc3fe01a1ff2fe9b1cbfb591e90d5ce (MDEV-26450) we introduced the function log_write_and_flush(), which may compete with log_checkpoint() invoking log_write_flush_to_disk_low() from another thread. The assertion n_pending_flushes==1 is too strict. There is no possibility of a race condition here, because fil_flush() is protected by fil_system->mutex and the rest will be protected by log_sys->mutex. log_write_flush_to_disk_low(), log_write_and_flush(): Relax the assertions to test for a nonzero count.
-rw-r--r--storage/innobase/log/log0log.cc11
1 files changed, 3 insertions, 8 deletions
diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc
index 945c97daf4a..8dc29e302dd 100644
--- a/storage/innobase/log/log0log.cc
+++ b/storage/innobase/log/log0log.cc
@@ -983,13 +983,9 @@ loop:
/** Flush the recently written changes to the log file.
and invoke log_mutex_enter(). */
-static
-void
-log_write_flush_to_disk_low()
+static void log_write_flush_to_disk_low()
{
- /* FIXME: This is not holding log_sys->mutex while
- calling os_event_set()! */
- ut_a(log_sys->n_pending_flushes == 1); /* No other threads here */
+ ut_a(log_sys->n_pending_flushes);
bool do_flush = srv_file_flush_method != SRV_O_DSYNC;
@@ -997,7 +993,6 @@ log_write_flush_to_disk_low()
fil_flush(SRV_LOG_SPACE_FIRST_ID);
}
-
log_mutex_enter();
if (do_flush) {
log_sys->flushed_to_disk_lsn = log_sys->current_flush_lsn;
@@ -1329,7 +1324,7 @@ ATTRIBUTE_COLD void log_write_and_flush()
/* Code adapted from log_write_flush_to_disk_low() */
- ut_a(log_sys->n_pending_flushes == 1); /* No other threads here */
+ ut_a(log_sys->n_pending_flushes);
if (srv_file_flush_method != SRV_O_DSYNC)
fil_flush(SRV_LOG_SPACE_FIRST_ID);