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.
This commit is contained in:
parent
6f32b28be5
commit
2bb8d7c2f3
@ -983,13 +983,9 @@ loop:
|
|||||||
|
|
||||||
/** Flush the recently written changes to the log file.
|
/** Flush the recently written changes to the log file.
|
||||||
and invoke log_mutex_enter(). */
|
and invoke log_mutex_enter(). */
|
||||||
static
|
static void log_write_flush_to_disk_low()
|
||||||
void
|
|
||||||
log_write_flush_to_disk_low()
|
|
||||||
{
|
{
|
||||||
/* FIXME: This is not holding log_sys->mutex while
|
ut_a(log_sys->n_pending_flushes);
|
||||||
calling os_event_set()! */
|
|
||||||
ut_a(log_sys->n_pending_flushes == 1); /* No other threads here */
|
|
||||||
|
|
||||||
bool do_flush = srv_file_flush_method != SRV_O_DSYNC;
|
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);
|
fil_flush(SRV_LOG_SPACE_FIRST_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log_mutex_enter();
|
log_mutex_enter();
|
||||||
if (do_flush) {
|
if (do_flush) {
|
||||||
log_sys->flushed_to_disk_lsn = log_sys->current_flush_lsn;
|
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() */
|
/* 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)
|
if (srv_file_flush_method != SRV_O_DSYNC)
|
||||||
fil_flush(SRV_LOG_SPACE_FIRST_ID);
|
fil_flush(SRV_LOG_SPACE_FIRST_ID);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user