mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Add GUC to log long wait times on recovery conflicts.
This commit adds GUC log_recovery_conflict_waits that controls whether a log message is produced when the startup process is waiting longer than deadlock_timeout for recovery conflicts. This is useful in determining if recovery conflicts prevent the recovery from applying WAL. Note that currently a log message is produced only when recovery conflict has not been resolved yet even after deadlock_timeout passes, i.e., only when the startup process is still waiting for recovery conflict even after deadlock_timeout. Author: Bertrand Drouvot, Masahiko Sawada Reviewed-by: Alvaro Herrera, Kyotaro Horiguchi, Fujii Masao Discussion: https://postgr.es/m/9a60178c-a853-1440-2cdc-c3af916cff59@amazon.com
This commit is contained in:
doc/src/sgml
src
@ -3809,6 +3809,8 @@ LockBufferForCleanup(Buffer buffer)
|
||||
{
|
||||
BufferDesc *bufHdr;
|
||||
char *new_status = NULL;
|
||||
TimestampTz waitStart = 0;
|
||||
bool logged_recovery_conflict = false;
|
||||
|
||||
Assert(BufferIsPinned(buffer));
|
||||
Assert(PinCountWaitBuf == NULL);
|
||||
@ -3882,6 +3884,34 @@ LockBufferForCleanup(Buffer buffer)
|
||||
new_status[len] = '\0'; /* truncate off " waiting" */
|
||||
}
|
||||
|
||||
/*
|
||||
* Emit the log message if the startup process is waiting longer
|
||||
* than deadlock_timeout for recovery conflict on buffer pin.
|
||||
*
|
||||
* Skip this if first time through because the startup process has
|
||||
* not started waiting yet in this case. So, the wait start
|
||||
* timestamp is set after this logic.
|
||||
*/
|
||||
if (waitStart != 0 && !logged_recovery_conflict)
|
||||
{
|
||||
TimestampTz now = GetCurrentTimestamp();
|
||||
|
||||
if (TimestampDifferenceExceeds(waitStart, now,
|
||||
DeadlockTimeout))
|
||||
{
|
||||
LogRecoveryConflict(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN,
|
||||
waitStart, now, NULL);
|
||||
logged_recovery_conflict = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the wait start timestamp if logging is enabled and first
|
||||
* time through.
|
||||
*/
|
||||
if (log_recovery_conflict_waits && waitStart == 0)
|
||||
waitStart = GetCurrentTimestamp();
|
||||
|
||||
/* Publish the bufid that Startup process waits on */
|
||||
SetStartupBufferPinWaitBufId(buffer - 1);
|
||||
/* Set alarm and then wait to be signaled by UnpinBuffer() */
|
||||
|
Reference in New Issue
Block a user