61#include "utils/fmgrprotos.h"
83 "WaitLSNWaitEvents must match WaitLSNType enum");
108 elog(
ERROR,
"invalid LSN wait type: %d", lsnType);
174 int i = (int) lsnType;
195 int i = (int) lsnType;
220 int i = (int) lsnType;
242#define WAKEUP_PROC_STATIC_ARRAY_SIZE (16)
261 int i = (int) lsnType;
286 wakeUpProcs[numWakeUpProcs++] = procInfo->
procno;
306 for (
i = 0;
i < numWakeUpProcs;
i++)
318 int i = (int) lsnType;
423 if (targetLSN <= currentLSN)
445 errcode(ERRCODE_ADMIN_SHUTDOWN),
446 errmsg(
"terminating connection due to unexpected postmaster exit"),
463 if (targetLSN > currentLSN)
static void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
static void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
long TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
TimestampTz GetCurrentTimestamp(void)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
void SetLatch(Latch *latch)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
#define CHECK_FOR_INTERRUPTS()
void pairingheap_remove(pairingheap *heap, pairingheap_node *node)
void pairingheap_add(pairingheap *heap, pairingheap_node *node)
void pairingheap_initialize(pairingheap *heap, pairingheap_comparator compare, void *arg)
pairingheap_node * pairingheap_remove_first(pairingheap *heap)
pairingheap_node * pairingheap_first(pairingheap *heap)
#define pairingheap_is_empty(h)
#define pairingheap_container(type, membername, ptr)
#define pairingheap_const_container(type, membername, ptr)
#define NUM_AUXILIARY_PROCS
#define GetPGProcByNumber(n)
Size add_size(Size s1, Size s2)
Size mul_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
pairingheap_node heapNode
WaitLSNProcInfo procInfos[FLEXIBLE_ARRAY_MEMBER]
pg_atomic_uint64 minWaitedLSN[WAIT_LSN_TYPE_COUNT]
pairingheap waitersHeap[WAIT_LSN_TYPE_COUNT]
#define TimestampTzPlusMilliseconds(tz, ms)
#define WL_POSTMASTER_DEATH
XLogRecPtr GetWalRcvFlushRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI)
XLogRecPtr GetWalRcvWriteRecPtr(void)
bool RecoveryInProgress(void)
XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI)
#define XLogRecPtrIsValid(r)
bool PromoteIsTriggered(void)
XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI)
void WaitLSNShmemInit(void)
static int waitlsn_cmp(const pairingheap_node *a, const pairingheap_node *b, void *arg)
void WaitLSNCleanup(void)
#define WAKEUP_PROC_STATIC_ARRAY_SIZE
static bool WaitLSNTypeRequiresRecovery(WaitLSNType t)
struct WaitLSNState * waitLSNState
static void updateMinWaitedLSN(WaitLSNType lsnType)
static void deleteLSNWaiter(WaitLSNType lsnType)
XLogRecPtr GetCurrentLSNForWaitType(WaitLSNType lsnType)
WaitLSNResult WaitForLSN(WaitLSNType lsnType, XLogRecPtr targetLSN, int64 timeout)
StaticAssertDecl(lengthof(WaitLSNWaitEvents)==WAIT_LSN_TYPE_COUNT, "WaitLSNWaitEvents must match WaitLSNType enum")
static void wakeupWaiters(WaitLSNType lsnType, XLogRecPtr currentLSN)
static void addLSNWaiter(XLogRecPtr lsn, WaitLSNType lsnType)
void WaitLSNWakeup(WaitLSNType lsnType, XLogRecPtr currentLSN)
Size WaitLSNShmemSize(void)
static const uint32 WaitLSNWaitEvents[]
#define WAIT_LSN_TYPE_COUNT
@ WAIT_LSN_RESULT_NOT_IN_RECOVERY
@ WAIT_LSN_RESULT_TIMEOUT
@ WAIT_LSN_RESULT_SUCCESS
@ WAIT_LSN_TYPE_PRIMARY_FLUSH
@ WAIT_LSN_TYPE_STANDBY_REPLAY
@ WAIT_LSN_TYPE_STANDBY_FLUSH
@ WAIT_LSN_TYPE_STANDBY_WRITE