PostgreSQL Source Code git master
Loading...
Searching...
No Matches
xlogwait.h File Reference
#include "access/xlogdefs.h"
#include "lib/pairingheap.h"
#include "port/atomics.h"
#include "storage/procnumber.h"
#include "storage/spin.h"
#include "tcop/dest.h"
Include dependency graph for xlogwait.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  WaitLSNProcInfo
 
struct  WaitLSNState
 

Macros

#define WAIT_LSN_TYPE_COUNT   (WAIT_LSN_TYPE_PRIMARY_FLUSH + 1)
 

Typedefs

typedef enum WaitLSNType WaitLSNType
 
typedef struct WaitLSNProcInfo WaitLSNProcInfo
 
typedef struct WaitLSNState WaitLSNState
 

Enumerations

enum  WaitLSNResult { WAIT_LSN_RESULT_SUCCESS , WAIT_LSN_RESULT_NOT_IN_RECOVERY , WAIT_LSN_RESULT_TIMEOUT }
 
enum  WaitLSNType { WAIT_LSN_TYPE_STANDBY_REPLAY , WAIT_LSN_TYPE_STANDBY_WRITE , WAIT_LSN_TYPE_STANDBY_FLUSH , WAIT_LSN_TYPE_PRIMARY_FLUSH }
 

Functions

Size WaitLSNShmemSize (void)
 
void WaitLSNShmemInit (void)
 
XLogRecPtr GetCurrentLSNForWaitType (WaitLSNType lsnType)
 
void WaitLSNWakeup (WaitLSNType lsnType, XLogRecPtr currentLSN)
 
void WaitLSNCleanup (void)
 
WaitLSNResult WaitForLSN (WaitLSNType lsnType, XLogRecPtr targetLSN, int64 timeout)
 

Variables

PGDLLIMPORT WaitLSNStatewaitLSNState
 

Macro Definition Documentation

◆ WAIT_LSN_TYPE_COUNT

#define WAIT_LSN_TYPE_COUNT   (WAIT_LSN_TYPE_PRIMARY_FLUSH + 1)

Definition at line 47 of file xlogwait.h.

Typedef Documentation

◆ WaitLSNProcInfo

◆ WaitLSNState

◆ WaitLSNType

Enumeration Type Documentation

◆ WaitLSNResult

Enumerator
WAIT_LSN_RESULT_SUCCESS 
WAIT_LSN_RESULT_NOT_IN_RECOVERY 
WAIT_LSN_RESULT_TIMEOUT 

Definition at line 25 of file xlogwait.h.

26{
27 WAIT_LSN_RESULT_SUCCESS, /* Target LSN is reached */
28 WAIT_LSN_RESULT_NOT_IN_RECOVERY, /* Recovery ended before or during our
29 * wait */
30 WAIT_LSN_RESULT_TIMEOUT /* Timeout occurred */
WaitLSNResult
Definition xlogwait.h:26
@ WAIT_LSN_RESULT_NOT_IN_RECOVERY
Definition xlogwait.h:28
@ WAIT_LSN_RESULT_TIMEOUT
Definition xlogwait.h:30
@ WAIT_LSN_RESULT_SUCCESS
Definition xlogwait.h:27

◆ WaitLSNType

Enumerator
WAIT_LSN_TYPE_STANDBY_REPLAY 
WAIT_LSN_TYPE_STANDBY_WRITE 
WAIT_LSN_TYPE_STANDBY_FLUSH 
WAIT_LSN_TYPE_PRIMARY_FLUSH 

Definition at line 36 of file xlogwait.h.

37{
38 /* Standby wait types (walreceiver/startup wakes) */
42
43 /* Primary wait types (WAL writer/backends wake) */
WaitLSNType
Definition xlogwait.h:37
@ WAIT_LSN_TYPE_PRIMARY_FLUSH
Definition xlogwait.h:44
@ WAIT_LSN_TYPE_STANDBY_REPLAY
Definition xlogwait.h:39
@ WAIT_LSN_TYPE_STANDBY_FLUSH
Definition xlogwait.h:41
@ WAIT_LSN_TYPE_STANDBY_WRITE
Definition xlogwait.h:40

Function Documentation

◆ GetCurrentLSNForWaitType()

XLogRecPtr GetCurrentLSNForWaitType ( WaitLSNType  lsnType)
extern

Definition at line 89 of file xlogwait.c.

90{
91 Assert(lsnType >= 0 && lsnType < WAIT_LSN_TYPE_COUNT);
92
93 switch (lsnType)
94 {
97
99 return GetWalRcvWriteRecPtr();
100
103
105 return GetFlushRecPtr(NULL);
106 }
107
108 elog(ERROR, "invalid LSN wait type: %d", lsnType);
110}
#define Assert(condition)
Definition c.h:945
#define pg_unreachable()
Definition c.h:361
#define ERROR
Definition elog.h:39
#define elog(elevel,...)
Definition elog.h:226
static int fb(int x)
XLogRecPtr GetWalRcvFlushRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI)
XLogRecPtr GetWalRcvWriteRecPtr(void)
XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI)
Definition xlog.c:6609
XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI)
#define WAIT_LSN_TYPE_COUNT
Definition xlogwait.h:47

References Assert, elog, ERROR, fb(), GetFlushRecPtr(), GetWalRcvFlushRecPtr(), GetWalRcvWriteRecPtr(), GetXLogReplayRecPtr(), pg_unreachable, WAIT_LSN_TYPE_COUNT, WAIT_LSN_TYPE_PRIMARY_FLUSH, WAIT_LSN_TYPE_STANDBY_FLUSH, WAIT_LSN_TYPE_STANDBY_REPLAY, and WAIT_LSN_TYPE_STANDBY_WRITE.

Referenced by ExecWaitStmt(), and WaitForLSN().

◆ WaitForLSN()

WaitLSNResult WaitForLSN ( WaitLSNType  lsnType,
XLogRecPtr  targetLSN,
int64  timeout 
)
extern

Definition at line 376 of file xlogwait.c.

377{
381
382 /* Shouldn't be called when shmem isn't initialized */
384
385 /* Should have a valid proc number */
387
388 if (timeout > 0)
389 {
392 }
393
394 /*
395 * Add our process to the waiters heap. It might happen that target LSN
396 * gets reached before we do. The check at the beginning of the loop
397 * below prevents the race condition.
398 */
399 addLSNWaiter(targetLSN, lsnType);
400
401 for (;;)
402 {
403 int rc;
404 long delay_ms = -1;
405
406 /* Get current LSN for the wait type */
408
409 /* Check that recovery is still in-progress */
411 {
412 /*
413 * Recovery was ended, but check if target LSN was already
414 * reached.
415 */
416 deleteLSNWaiter(lsnType);
417
421 }
422 else
423 {
424 /* Check if the waited LSN has been reached */
425 if (targetLSN <= currentLSN)
426 break;
427 }
428
429 if (timeout > 0)
430 {
432 if (delay_ms <= 0)
433 break;
434 }
435
437
438 rc = WaitLatch(MyLatch, wake_events, delay_ms,
439 WaitLSNWaitEvents[lsnType]);
440
441 /*
442 * Emergency bailout if postmaster has died. This is to avoid the
443 * necessity for manual cleanup of all postmaster children.
444 */
445 if (rc & WL_POSTMASTER_DEATH)
448 errmsg("terminating connection due to unexpected postmaster exit"),
449 errcontext("while waiting for LSN"));
450
451 if (rc & WL_LATCH_SET)
453 }
454
455 /*
456 * Delete our process from the shared memory heap. We might already be
457 * deleted by the startup process. The 'inHeap' flags prevents us from
458 * the double deletion.
459 */
460 deleteLSNWaiter(lsnType);
461
462 /*
463 * If we didn't reach the target LSN, we must be exited by timeout.
464 */
465 if (targetLSN > currentLSN)
467
469}
long TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
Definition timestamp.c:1748
TimestampTz GetCurrentTimestamp(void)
Definition timestamp.c:1636
int64 TimestampTz
Definition timestamp.h:39
int errcode(int sqlerrcode)
Definition elog.c:874
#define errcontext
Definition elog.h:198
#define FATAL
Definition elog.h:41
#define ereport(elevel,...)
Definition elog.h:150
ProcNumber MyProcNumber
Definition globals.c:90
int MaxBackends
Definition globals.c:146
struct Latch * MyLatch
Definition globals.c:63
void ResetLatch(Latch *latch)
Definition latch.c:374
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
Definition latch.c:172
#define CHECK_FOR_INTERRUPTS()
Definition miscadmin.h:123
static char * errmsg
#define NUM_AUXILIARY_PROCS
Definition proc.h:524
#define TimestampTzPlusMilliseconds(tz, ms)
Definition timestamp.h:85
#define WL_TIMEOUT
#define WL_LATCH_SET
#define WL_POSTMASTER_DEATH
bool RecoveryInProgress(void)
Definition xlog.c:6444
uint64 XLogRecPtr
Definition xlogdefs.h:21
bool PromoteIsTriggered(void)
static bool WaitLSNTypeRequiresRecovery(WaitLSNType t)
Definition xlogwait.c:360
struct WaitLSNState * waitLSNState
Definition xlogwait.c:69
static void deleteLSNWaiter(WaitLSNType lsnType)
Definition xlogwait.c:217
XLogRecPtr GetCurrentLSNForWaitType(WaitLSNType lsnType)
Definition xlogwait.c:89
static void addLSNWaiter(XLogRecPtr lsn, WaitLSNType lsnType)
Definition xlogwait.c:192
static const uint32 WaitLSNWaitEvents[]
Definition xlogwait.c:75

References addLSNWaiter(), Assert, CHECK_FOR_INTERRUPTS, deleteLSNWaiter(), ereport, errcode(), errcontext, errmsg, FATAL, fb(), GetCurrentLSNForWaitType(), GetCurrentTimestamp(), MaxBackends, MyLatch, MyProcNumber, NUM_AUXILIARY_PROCS, PromoteIsTriggered(), RecoveryInProgress(), ResetLatch(), TimestampDifferenceMilliseconds(), TimestampTzPlusMilliseconds, WAIT_LSN_RESULT_NOT_IN_RECOVERY, WAIT_LSN_RESULT_SUCCESS, WAIT_LSN_RESULT_TIMEOUT, WaitLatch(), waitLSNState, WaitLSNTypeRequiresRecovery(), WaitLSNWaitEvents, WL_LATCH_SET, WL_POSTMASTER_DEATH, and WL_TIMEOUT.

Referenced by ExecWaitStmt().

◆ WaitLSNCleanup()

void WaitLSNCleanup ( void  )
extern

Definition at line 339 of file xlogwait.c.

340{
341 if (waitLSNState)
342 {
343 /*
344 * We do a fast-path check of the inHeap flag without the lock. This
345 * flag is set to true only by the process itself. So, it's only
346 * possible to get a false positive. But that will be eliminated by a
347 * recheck inside deleteLSNWaiter().
348 */
351 }
352}
WaitLSNType lsnType
Definition xlogwait.h:60
WaitLSNProcInfo procInfos[FLEXIBLE_ARRAY_MEMBER]
Definition xlogwait.h:97

References deleteLSNWaiter(), WaitLSNProcInfo::inHeap, WaitLSNProcInfo::lsnType, MyProcNumber, WaitLSNState::procInfos, and waitLSNState.

Referenced by AbortTransaction(), and ProcKill().

◆ WaitLSNShmemInit()

void WaitLSNShmemInit ( void  )
extern

Definition at line 125 of file xlogwait.c.

126{
127 bool found;
128
129 waitLSNState = (WaitLSNState *) ShmemInitStruct("WaitLSNState",
131 &found);
132 if (!found)
133 {
134 int i;
135
136 /* Initialize heaps and tracking */
137 for (i = 0; i < WAIT_LSN_TYPE_COUNT; i++)
138 {
141 }
142
143 /* Initialize process info array */
146 }
147}
static void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
Definition atomics.h:453
#define PG_UINT64_MAX
Definition c.h:679
int i
Definition isn.c:77
void pairingheap_initialize(pairingheap *heap, pairingheap_comparator compare, void *arg)
Definition pairingheap.c:60
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Definition shmem.c:381
pg_atomic_uint64 minWaitedLSN[WAIT_LSN_TYPE_COUNT]
Definition xlogwait.h:85
pairingheap waitersHeap[WAIT_LSN_TYPE_COUNT]
Definition xlogwait.h:91
static int waitlsn_cmp(const pairingheap_node *a, const pairingheap_node *b, void *arg)
Definition xlogwait.c:154
Size WaitLSNShmemSize(void)
Definition xlogwait.c:114

References fb(), i, MaxBackends, WaitLSNState::minWaitedLSN, NUM_AUXILIARY_PROCS, pairingheap_initialize(), pg_atomic_init_u64(), PG_UINT64_MAX, WaitLSNState::procInfos, ShmemInitStruct(), WAIT_LSN_TYPE_COUNT, WaitLSNState::waitersHeap, waitlsn_cmp(), WaitLSNShmemSize(), and waitLSNState.

Referenced by CreateOrAttachShmemStructs().

◆ WaitLSNShmemSize()

Size WaitLSNShmemSize ( void  )
extern

Definition at line 114 of file xlogwait.c.

115{
116 Size size;
117
118 size = offsetof(WaitLSNState, procInfos);
120 return size;
121}
size_t Size
Definition c.h:691
Size add_size(Size s1, Size s2)
Definition shmem.c:485
Size mul_size(Size s1, Size s2)
Definition shmem.c:500

References add_size(), fb(), MaxBackends, mul_size(), NUM_AUXILIARY_PROCS, and WaitLSNState::procInfos.

Referenced by CalculateShmemSize(), and WaitLSNShmemInit().

◆ WaitLSNWakeup()

void WaitLSNWakeup ( WaitLSNType  lsnType,
XLogRecPtr  currentLSN 
)
extern

Definition at line 318 of file xlogwait.c.

319{
320 int i = (int) lsnType;
321
322 Assert(i >= 0 && i < WAIT_LSN_TYPE_COUNT);
323
324 /*
325 * Fast path check. Skip if currentLSN is InvalidXLogRecPtr, which means
326 * "wake all waiters" (e.g., during promotion when recovery ends).
327 */
330 return;
331
332 wakeupWaiters(lsnType, currentLSN);
333}
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
Definition atomics.h:467
#define XLogRecPtrIsValid(r)
Definition xlogdefs.h:29
static void wakeupWaiters(WaitLSNType lsnType, XLogRecPtr currentLSN)
Definition xlogwait.c:257

References Assert, fb(), i, WaitLSNState::minWaitedLSN, pg_atomic_read_u64(), WAIT_LSN_TYPE_COUNT, waitLSNState, wakeupWaiters(), and XLogRecPtrIsValid.

Referenced by PerformWalRecovery(), StartupXLOG(), XLogBackgroundFlush(), XLogFlush(), XLogWalRcvFlush(), and XLogWalRcvWrite().

Variable Documentation

◆ waitLSNState