mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
Implement waiting for given lsn at transaction start
This commit adds following optional clause to BEGIN and START TRANSACTION commands. WAIT FOR LSN lsn [ TIMEOUT timeout ] New clause pospones transaction start till given lsn is applied on standby. This clause allows user be sure, that changes previously made on primary would be visible on standby. New shared memory struct is used to track awaited lsn per backend. Recovery process wakes up backend once required lsn is applied. Author: Ivan Kartyshov, Anna Akenteva Reviewed-by: Craig Ringer, Thomas Munro, Robert Haas, Kyotaro Horiguchi Reviewed-by: Masahiko Sawada, Ants Aasma, Dmitry Ivanov, Simon Riggs Reviewed-by: Amit Kapila, Alexander Korotkov Discussion: https://postgr.es/m/0240c26c-9f84-30ea-fca9-93ab2df5f305%40postgrespro.ru
This commit is contained in:
@ -42,6 +42,7 @@
|
||||
#include "catalog/pg_database.h"
|
||||
#include "commands/progress.h"
|
||||
#include "commands/tablespace.h"
|
||||
#include "commands/wait.h"
|
||||
#include "common/controldata_utils.h"
|
||||
#include "executor/instrument.h"
|
||||
#include "miscadmin.h"
|
||||
@ -7154,6 +7155,7 @@ StartupXLOG(void)
|
||||
do
|
||||
{
|
||||
bool switchedTLI = false;
|
||||
XLogRecPtr minWaitedLSN;
|
||||
|
||||
#ifdef WAL_DEBUG
|
||||
if (XLOG_DEBUG ||
|
||||
@ -7357,6 +7359,17 @@ StartupXLOG(void)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we replayed an LSN that someone was waiting for, set
|
||||
* latches in shared memory array to notify the waiter.
|
||||
*/
|
||||
minWaitedLSN = WaitLSNGetMin();
|
||||
if (!XLogRecPtrIsInvalid(minWaitedLSN) &&
|
||||
minWaitedLSN <= XLogCtl->lastReplayedEndRecPtr)
|
||||
{
|
||||
WaitLSNSetLatch(XLogCtl->lastReplayedEndRecPtr);
|
||||
}
|
||||
|
||||
/* Else, try to fetch the next WAL record */
|
||||
record = ReadRecord(xlogreader, LOG, false);
|
||||
} while (record != NULL);
|
||||
|
Reference in New Issue
Block a user