mirror of
https://github.com/postgres/postgres.git
synced 2025-05-08 07:21:33 +03:00
Rework activation of commit timestamps during recovery
The activation and deactivation of commit timestamp tracking has not been handled consistently for a primary or standbys at recovery. The facility can be activated at three different moments of recovery: - The beginning, where a primary would use the GUC value for the decision-making, and where a standby relies on the contents of the control file. - When replaying a XLOG_PARAMETER_CHANGE record at redo. - The end, where both primary and standby rely on the GUC value. Using the GUC value for a primary at the beginning of recovery causes problems with commit timestamp access when doing crash recovery. Particularly, when replaying transaction commits, it could be possible that an attempt to read commit timestamps is done for a transaction which committed at a moment when track_commit_timestamp was disabled. A test case is added to reproduce the failure. The test works down to v11 as it takes advantage of transaction commits within procedures. Reported-by: Hailong Li Author: Masahiko Sawasa, Michael Paquier Reviewed-by: Kyotaro Horiguchi Discussion: https://postgr.es/m/11224478-a782-203b-1f17-e4797b39bdf0@qunar.com Backpatch-through: 9.5, where commit timestamps have been introduced.
This commit is contained in:
parent
0a4456a70d
commit
e513a3d854
@ -572,10 +572,9 @@ CompleteCommitTsInitialization(void)
|
|||||||
* any leftover data.
|
* any leftover data.
|
||||||
*
|
*
|
||||||
* Conversely, we activate the module if the feature is enabled. This is
|
* Conversely, we activate the module if the feature is enabled. This is
|
||||||
* not necessary in a master system because we already did it earlier, but
|
* necessary for primary and standby as the activation depends on the
|
||||||
* if we're in a standby server that got promoted which had the feature
|
* control file contents at the beginning of recovery or when a
|
||||||
* enabled and was following a master that had the feature disabled, this
|
* XLOG_PARAMETER_CHANGE is replayed.
|
||||||
* is where we turn it on locally.
|
|
||||||
*/
|
*/
|
||||||
if (!track_commit_timestamp)
|
if (!track_commit_timestamp)
|
||||||
DeactivateCommitTs();
|
DeactivateCommitTs();
|
||||||
@ -585,7 +584,7 @@ CompleteCommitTsInitialization(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Activate or deactivate CommitTs' upon reception of a XLOG_PARAMETER_CHANGE
|
* Activate or deactivate CommitTs' upon reception of a XLOG_PARAMETER_CHANGE
|
||||||
* XLog record in a standby.
|
* XLog record during recovery.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
CommitTsParameterChange(bool newvalue, bool oldvalue)
|
CommitTsParameterChange(bool newvalue, bool oldvalue)
|
||||||
|
@ -6467,11 +6467,12 @@ StartupXLOG(void)
|
|||||||
StartupMultiXact();
|
StartupMultiXact();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ditto commit timestamps. In a standby, we do it if setting is enabled
|
* Ditto for commit timestamps. Activate the facility if the setting is
|
||||||
* in ControlFile; in a master we base the decision on the GUC itself.
|
* enabled in the control file, as there should be no tracking of commit
|
||||||
|
* timestamps done when the setting was disabled. This facility can be
|
||||||
|
* started or stopped when replaying a XLOG_PARAMETER_CHANGE record.
|
||||||
*/
|
*/
|
||||||
if (ArchiveRecoveryRequested ?
|
if (ControlFile->track_commit_timestamp)
|
||||||
ControlFile->track_commit_timestamp : track_commit_timestamp)
|
|
||||||
StartupCommitTs();
|
StartupCommitTs();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user