mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Delay updating control file to "in production"
Move the updating of the control file to "in production" status until the point where WAL writes are allowed. Before, there could be a significant gap between the control file update and write transactions actually being allowed. This makes it more reliable to use the control status to verify the end of a promotion. From: Michael Paquier <michael.paquier@gmail.com>
This commit is contained in:
parent
c1dc51d484
commit
ebdf5bf7d1
@ -7431,12 +7431,6 @@ StartupXLOG(void)
|
|||||||
*/
|
*/
|
||||||
InRecovery = false;
|
InRecovery = false;
|
||||||
|
|
||||||
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
|
|
||||||
ControlFile->state = DB_IN_PRODUCTION;
|
|
||||||
ControlFile->time = (pg_time_t) time(NULL);
|
|
||||||
UpdateControlFile();
|
|
||||||
LWLockRelease(ControlFileLock);
|
|
||||||
|
|
||||||
/* start the archive_timeout timer running */
|
/* start the archive_timeout timer running */
|
||||||
XLogCtl->lastSegSwitchTime = (pg_time_t) time(NULL);
|
XLogCtl->lastSegSwitchTime = (pg_time_t) time(NULL);
|
||||||
|
|
||||||
@ -7494,15 +7488,32 @@ StartupXLOG(void)
|
|||||||
CompleteCommitTsInitialization();
|
CompleteCommitTsInitialization();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All done. Allow backends to write WAL. (Although the bool flag is
|
* All done with end-of-recovery actions.
|
||||||
* probably atomic in itself, we use the info_lck here to ensure that
|
*
|
||||||
* there are no race conditions concerning visibility of other recent
|
* Now allow backends to write WAL and update the control file status in
|
||||||
* updates to shared memory.)
|
* consequence. The boolean flag allowing backends to write WAL is
|
||||||
|
* updated while holding ControlFileLock to prevent other backends to look
|
||||||
|
* at an inconsistent state of the control file in shared memory. There
|
||||||
|
* is still a small window during which backends can write WAL and the
|
||||||
|
* control file is still referring to a system not in DB_IN_PRODUCTION
|
||||||
|
* state while looking at the on-disk control file.
|
||||||
|
*
|
||||||
|
* Also, although the boolean flag to allow WAL is probably atomic in
|
||||||
|
* itself, we use the info_lck here to ensure that there are no race
|
||||||
|
* conditions concerning visibility of other recent updates to shared
|
||||||
|
* memory.
|
||||||
*/
|
*/
|
||||||
|
LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
|
||||||
|
ControlFile->state = DB_IN_PRODUCTION;
|
||||||
|
ControlFile->time = (pg_time_t) time(NULL);
|
||||||
|
|
||||||
SpinLockAcquire(&XLogCtl->info_lck);
|
SpinLockAcquire(&XLogCtl->info_lck);
|
||||||
XLogCtl->SharedRecoveryInProgress = false;
|
XLogCtl->SharedRecoveryInProgress = false;
|
||||||
SpinLockRelease(&XLogCtl->info_lck);
|
SpinLockRelease(&XLogCtl->info_lck);
|
||||||
|
|
||||||
|
UpdateControlFile();
|
||||||
|
LWLockRelease(ControlFileLock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there were cascading standby servers connected to us, nudge any wal
|
* If there were cascading standby servers connected to us, nudge any wal
|
||||||
* sender processes to notice that we've been promoted.
|
* sender processes to notice that we've been promoted.
|
||||||
|
Loading…
Reference in New Issue
Block a user