summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2023-03-16 13:39:23 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2023-03-16 13:39:23 +0200
commit1495f057c8a3aa5783de0993f6f95aae3e352f7a (patch)
tree7f0537277d48a74b41d20f1ee0e82ffe178755c9 /storage
parent7d6b3d40085562d6f9f110f4ba921cf061548844 (diff)
downloadmariadb-git-1495f057c8a3aa5783de0993f6f95aae3e352f7a.tar.gz
MDEV-30860 Race condition between buffer pool flush and log file deletion in mariadb-backup --prepare
srv_start(): If we are going to close the log file in mariadb-backup --prepare, call buf_flush_sync() before calling recv_sys.debug_free() to ensure that the log file will not be accessed. This fixes a rather rare failure in the test mariabackup.innodb_force_recovery where buf_flush_page_cleaner() would invoke log_checkpoint_low() because !recv_recovery_is_on() would hold due to the fact that recv_sys.debug_free() had already been called. Then, the log write for the checkpoint would fail because srv_start() had invoked log_sys.log.close_file().
Diffstat (limited to 'storage')
-rw-r--r--storage/innobase/srv/srv0start.cc10
1 files changed, 5 insertions, 5 deletions
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index cc2bb699fd9..44fca2c81a5 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -922,9 +922,7 @@ static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists)
{
DBUG_ENTER("srv_prepare_to_delete_redo_log_file");
- /* Disable checkpoints in the page cleaner. */
- ut_ad(!recv_sys.recovery_on);
- recv_sys.recovery_on= true;
+ ut_ad(recv_sys.recovery_on);
/* Clean the buffer pool. */
buf_flush_sync();
@@ -1606,10 +1604,10 @@ file_checked:
}
}
- recv_sys.debug_free();
-
if (srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT) {
+ buf_flush_sync();
+ recv_sys.debug_free();
/* After applying the redo log from
SRV_OPERATION_BACKUP, flush the changes
to the data files and truncate or delete the log.
@@ -1701,6 +1699,8 @@ file_checked:
return(srv_init_abort(err));
}
}
+
+ recv_sys.debug_free();
}
ut_ad(err == DB_SUCCESS);