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

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 98 of file xlogwait.c.

99{
100 Assert(lsnType >= 0 && lsnType < WAIT_LSN_TYPE_COUNT);
101
102 switch (lsnType)
103 {
106
108 return GetWalRcvWriteRecPtr();
109
112
114 return GetFlushRecPtr(NULL);
115 }
116
117 elog(ERROR, "invalid LSN wait type: %d", lsnType);
119}
#define Assert(condition)
Definition c.h:943
#define pg_unreachable()
Definition c.h:367
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
static int fb(int x)
XLogRecPtr GetWalRcvFlushRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI)
XLogRecPtr GetWalRcvWriteRecPtr(void)
XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI)
Definition xlog.c:6995
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 378 of file xlogwait.c.

379{
383
384 /* Shouldn't be called when shmem isn't initialized */
386
387 /* Should have a valid proc number */
389
390 if (timeout > 0)
391 {
394 }
395
396 /*
397 * Add our process to the waiters heap. It might happen that target LSN
398 * gets reached before we do. The check at the beginning of the loop
399 * below prevents the race condition.
400 */
401 addLSNWaiter(targetLSN, lsnType);
402
403 for (;;)
404 {
405 int rc;
406 long delay_ms = -1;
407
408 /* Get current LSN for the wait type */
410
411 /* Check that recovery is still in-progress */
413 {
414 /*
415 * Recovery was ended, but check if target LSN was already
416 * reached.
417 */
418 deleteLSNWaiter(lsnType);
419
423 }
424 else
425 {
426 /* Check if the waited LSN has been reached */
427 if (targetLSN <= currentLSN)
428 break;
429 }
430
431 if (timeout > 0)
432 {
434 if (delay_ms <= 0)
435 break;
436 }
437
439
440 rc = WaitLatch(MyLatch, wake_events, delay_ms,
441 WaitLSNWaitEvents[lsnType]);
442
443 /*
444 * Emergency bailout if postmaster has died. This is to avoid the
445 * necessity for manual cleanup of all postmaster children.
446 */
447 if (rc & WL_POSTMASTER_DEATH)
450 errmsg("terminating connection due to unexpected postmaster exit"),
451 errcontext("while waiting for LSN"));
452
453 if (rc & WL_LATCH_SET)
455 }
456
457 /*
458 * Delete our process from the shared memory heap. We might already be
459 * deleted by the startup process. The 'inHeap' flags prevents us from
460 * the double deletion.
461 */
462 deleteLSNWaiter(lsnType);
463
464 /*
465 * If we didn't reach the target LSN, we must be exited by timeout.
466 */
467 if (targetLSN > currentLSN)
469
471}
long TimestampDifferenceMilliseconds(TimestampTz start_time, TimestampTz stop_time)
Definition timestamp.c:1751
TimestampTz GetCurrentTimestamp(void)
Definition timestamp.c:1639
int64 TimestampTz
Definition timestamp.h:39
int errcode(int sqlerrcode)
Definition elog.c:874
#define errcontext
Definition elog.h:200
#define FATAL
Definition elog.h:42
#define ereport(elevel,...)
Definition elog.h:152
ProcNumber MyProcNumber
Definition globals.c:92
int MaxBackends
Definition globals.c:149
struct Latch * MyLatch
Definition globals.c:65
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:125
static char * errmsg
#define NUM_AUXILIARY_PROCS
Definition proc.h:527
#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:6830
uint64 XLogRecPtr
Definition xlogdefs.h:21
bool PromoteIsTriggered(void)
static bool WaitLSNTypeRequiresRecovery(WaitLSNType t)
Definition xlogwait.c:362
struct WaitLSNState * waitLSNState
Definition xlogwait.c:70
static void deleteLSNWaiter(WaitLSNType lsnType)
Definition xlogwait.c:219
XLogRecPtr GetCurrentLSNForWaitType(WaitLSNType lsnType)
Definition xlogwait.c:98
static void addLSNWaiter(XLogRecPtr lsn, WaitLSNType lsnType)
Definition xlogwait.c:194
static const uint32 WaitLSNWaitEvents[]
Definition xlogwait.c:84

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 decode_concurrent_changes(), and ExecWaitStmt().

◆ WaitLSNCleanup()

void WaitLSNCleanup ( void  )
extern

Definition at line 341 of file xlogwait.c.

342{
343 if (waitLSNState)
344 {
345 /*
346 * We do a fast-path check of the inHeap flag without the lock. This
347 * flag is set to true only by the process itself. So, it's only
348 * possible to get a false positive. But that will be eliminated by a
349 * recheck inside deleteLSNWaiter().
350 */
353 }
354}
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().

◆ WaitLSNWakeup()

void WaitLSNWakeup ( WaitLSNType  lsnType,
XLogRecPtr  currentLSN 
)
extern

Definition at line 320 of file xlogwait.c.

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

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