PostgreSQL Source Code  git master
standbydefs.h File Reference
#include "access/xlogreader.h"
#include "lib/stringinfo.h"
#include "storage/lockdefs.h"
#include "storage/sinval.h"
Include dependency graph for standbydefs.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  xl_standby_locks
 
struct  xl_running_xacts
 
struct  xl_invalidations
 

Macros

#define XLOG_STANDBY_LOCK   0x00
 
#define XLOG_RUNNING_XACTS   0x10
 
#define XLOG_INVALIDATIONS   0x20
 
#define MinSizeOfInvalidations   offsetof(xl_invalidations, msgs)
 

Typedefs

typedef struct xl_standby_locks xl_standby_locks
 
typedef struct xl_running_xacts xl_running_xacts
 
typedef struct xl_invalidations xl_invalidations
 

Functions

void standby_redo (XLogReaderState *record)
 
void standby_desc (StringInfo buf, XLogReaderState *record)
 
const char * standby_identify (uint8 info)
 
void standby_desc_invalidations (StringInfo buf, int nmsgs, SharedInvalidationMessage *msgs, Oid dbId, Oid tsId, bool relcacheInitFileInval)
 

Macro Definition Documentation

◆ MinSizeOfInvalidations

#define MinSizeOfInvalidations   offsetof(xl_invalidations, msgs)

Definition at line 72 of file standbydefs.h.

◆ XLOG_INVALIDATIONS

#define XLOG_INVALIDATIONS   0x20

Definition at line 36 of file standbydefs.h.

◆ XLOG_RUNNING_XACTS

#define XLOG_RUNNING_XACTS   0x10

Definition at line 35 of file standbydefs.h.

◆ XLOG_STANDBY_LOCK

#define XLOG_STANDBY_LOCK   0x00

Definition at line 34 of file standbydefs.h.

Typedef Documentation

◆ xl_invalidations

◆ xl_running_xacts

◆ xl_standby_locks

Function Documentation

◆ standby_desc()

void standby_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 47 of file standbydesc.c.

48 {
49  char *rec = XLogRecGetData(record);
50  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
51 
52  if (info == XLOG_STANDBY_LOCK)
53  {
54  xl_standby_locks *xlrec = (xl_standby_locks *) rec;
55  int i;
56 
57  for (i = 0; i < xlrec->nlocks; i++)
58  appendStringInfo(buf, "xid %u db %u rel %u ",
59  xlrec->locks[i].xid, xlrec->locks[i].dbOid,
60  xlrec->locks[i].relOid);
61  }
62  else if (info == XLOG_RUNNING_XACTS)
63  {
64  xl_running_xacts *xlrec = (xl_running_xacts *) rec;
65 
67  }
68  else if (info == XLOG_INVALIDATIONS)
69  {
70  xl_invalidations *xlrec = (xl_invalidations *) rec;
71 
72  standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
73  xlrec->dbId, xlrec->tsId,
74  xlrec->relcacheInitFileInval);
75  }
76 }
unsigned char uint8
Definition: c.h:504
int i
Definition: isn.c:73
static char * buf
Definition: pg_test_fsync.c:73
#define XLOG_INVALIDATIONS
Definition: standbydefs.h:36
#define XLOG_STANDBY_LOCK
Definition: standbydefs.h:34
#define XLOG_RUNNING_XACTS
Definition: standbydefs.h:35
void standby_desc_invalidations(StringInfo buf, int nmsgs, SharedInvalidationMessage *msgs, Oid dbId, Oid tsId, bool relcacheInitFileInval)
Definition: standbydesc.c:105
static void standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
Definition: standbydesc.c:20
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:97
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER]
Definition: standbydefs.h:69
bool relcacheInitFileInval
Definition: standbydefs.h:67
TransactionId xid
Definition: lockdefs.h:51
xl_standby_lock locks[FLEXIBLE_ARRAY_MEMBER]
Definition: standbydefs.h:41
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415
#define XLR_INFO_MASK
Definition: xlogrecord.h:62

References appendStringInfo(), buf, xl_invalidations::dbId, xl_standby_lock::dbOid, i, xl_standby_locks::locks, xl_invalidations::msgs, xl_standby_locks::nlocks, xl_invalidations::nmsgs, xl_invalidations::relcacheInitFileInval, xl_standby_lock::relOid, standby_desc_invalidations(), standby_desc_running_xacts(), xl_invalidations::tsId, xl_standby_lock::xid, XLOG_INVALIDATIONS, XLOG_RUNNING_XACTS, XLOG_STANDBY_LOCK, XLogRecGetData, XLogRecGetInfo, and XLR_INFO_MASK.

◆ standby_desc_invalidations()

void standby_desc_invalidations ( StringInfo  buf,
int  nmsgs,
SharedInvalidationMessage msgs,
Oid  dbId,
Oid  tsId,
bool  relcacheInitFileInval 
)

Definition at line 105 of file standbydesc.c.

109 {
110  int i;
111 
112  /* Do nothing if there are no invalidation messages */
113  if (nmsgs <= 0)
114  return;
115 
116  if (relcacheInitFileInval)
117  appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
118  dbId, tsId);
119 
120  appendStringInfoString(buf, "; inval msgs:");
121  for (i = 0; i < nmsgs; i++)
122  {
123  SharedInvalidationMessage *msg = &msgs[i];
124 
125  if (msg->id >= 0)
126  appendStringInfo(buf, " catcache %d", msg->id);
127  else if (msg->id == SHAREDINVALCATALOG_ID)
128  appendStringInfo(buf, " catalog %u", msg->cat.catId);
129  else if (msg->id == SHAREDINVALRELCACHE_ID)
130  appendStringInfo(buf, " relcache %u", msg->rc.relId);
131  /* not expected, but print something anyway */
132  else if (msg->id == SHAREDINVALSMGR_ID)
133  appendStringInfoString(buf, " smgr");
134  /* not expected, but print something anyway */
135  else if (msg->id == SHAREDINVALRELMAP_ID)
136  appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
137  else if (msg->id == SHAREDINVALSNAPSHOT_ID)
138  appendStringInfo(buf, " snapshot %u", msg->sn.relId);
139  else
140  appendStringInfo(buf, " unrecognized id %d", msg->id);
141  }
142 }
#define SHAREDINVALCATALOG_ID
Definition: sinval.h:67
#define SHAREDINVALSMGR_ID
Definition: sinval.h:85
#define SHAREDINVALSNAPSHOT_ID
Definition: sinval.h:104
#define SHAREDINVALRELCACHE_ID
Definition: sinval.h:76
#define SHAREDINVALRELMAP_ID
Definition: sinval.h:96
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:182
SharedInvalRelcacheMsg rc
Definition: sinval.h:118
SharedInvalCatalogMsg cat
Definition: sinval.h:117
SharedInvalSnapshotMsg sn
Definition: sinval.h:121
SharedInvalRelmapMsg rm
Definition: sinval.h:120

References appendStringInfo(), appendStringInfoString(), buf, SharedInvalidationMessage::cat, SharedInvalCatalogMsg::catId, SharedInvalRelmapMsg::dbId, i, SharedInvalidationMessage::id, SharedInvalidationMessage::rc, SharedInvalRelcacheMsg::relId, SharedInvalSnapshotMsg::relId, SharedInvalidationMessage::rm, SHAREDINVALCATALOG_ID, SHAREDINVALRELCACHE_ID, SHAREDINVALRELMAP_ID, SHAREDINVALSMGR_ID, SHAREDINVALSNAPSHOT_ID, and SharedInvalidationMessage::sn.

Referenced by standby_desc(), xact_desc(), xact_desc_commit(), and xact_desc_prepare().

◆ standby_identify()

const char* standby_identify ( uint8  info)

Definition at line 79 of file standbydesc.c.

80 {
81  const char *id = NULL;
82 
83  switch (info & ~XLR_INFO_MASK)
84  {
85  case XLOG_STANDBY_LOCK:
86  id = "LOCK";
87  break;
88  case XLOG_RUNNING_XACTS:
89  id = "RUNNING_XACTS";
90  break;
91  case XLOG_INVALIDATIONS:
92  id = "INVALIDATIONS";
93  break;
94  }
95 
96  return id;
97 }

References XLOG_INVALIDATIONS, XLOG_RUNNING_XACTS, XLOG_STANDBY_LOCK, and XLR_INFO_MASK.

◆ standby_redo()

void standby_redo ( XLogReaderState record)

Definition at line 1159 of file standby.c.

1160 {
1161  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
1162 
1163  /* Backup blocks are not used in standby records */
1164  Assert(!XLogRecHasAnyBlockRefs(record));
1165 
1166  /* Do nothing if we're not in hot standby mode */
1168  return;
1169 
1170  if (info == XLOG_STANDBY_LOCK)
1171  {
1172  xl_standby_locks *xlrec = (xl_standby_locks *) XLogRecGetData(record);
1173  int i;
1174 
1175  for (i = 0; i < xlrec->nlocks; i++)
1177  xlrec->locks[i].dbOid,
1178  xlrec->locks[i].relOid);
1179  }
1180  else if (info == XLOG_RUNNING_XACTS)
1181  {
1182  xl_running_xacts *xlrec = (xl_running_xacts *) XLogRecGetData(record);
1183  RunningTransactionsData running;
1184 
1185  running.xcnt = xlrec->xcnt;
1186  running.subxcnt = xlrec->subxcnt;
1187  running.subxid_overflow = xlrec->subxid_overflow;
1188  running.nextXid = xlrec->nextXid;
1189  running.latestCompletedXid = xlrec->latestCompletedXid;
1190  running.oldestRunningXid = xlrec->oldestRunningXid;
1191  running.xids = xlrec->xids;
1192 
1193  ProcArrayApplyRecoveryInfo(&running);
1194 
1195  /*
1196  * The startup process currently has no convenient way to schedule
1197  * stats to be reported. XLOG_RUNNING_XACTS records issued at a
1198  * regular cadence, making this a convenient location to report stats.
1199  * While these records aren't generated with wal_level=minimal, stats
1200  * also cannot be accessed during WAL replay.
1201  */
1202  pgstat_report_stat(true);
1203  }
1204  else if (info == XLOG_INVALIDATIONS)
1205  {
1206  xl_invalidations *xlrec = (xl_invalidations *) XLogRecGetData(record);
1207 
1209  xlrec->nmsgs,
1210  xlrec->relcacheInitFileInval,
1211  xlrec->dbId,
1212  xlrec->tsId);
1213  }
1214  else
1215  elog(PANIC, "standby_redo: unknown op code %u", info);
1216 }
#define Assert(condition)
Definition: c.h:858
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:224
void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, int nmsgs, bool RelcacheInitFileInval, Oid dbid, Oid tsid)
Definition: inval.c:961
long pgstat_report_stat(bool force)
Definition: pgstat.c:579
void ProcArrayApplyRecoveryInfo(RunningTransactions running)
Definition: procarray.c:1054
void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid)
Definition: standby.c:985
TransactionId oldestRunningXid
Definition: standby.h:84
TransactionId nextXid
Definition: standby.h:83
TransactionId latestCompletedXid
Definition: standby.h:87
TransactionId * xids
Definition: standby.h:89
TransactionId latestCompletedXid
Definition: standbydefs.h:54
TransactionId oldestRunningXid
Definition: standbydefs.h:53
TransactionId xids[FLEXIBLE_ARRAY_MEMBER]
Definition: standbydefs.h:56
TransactionId nextXid
Definition: standbydefs.h:52
#define XLogRecHasAnyBlockRefs(decoder)
Definition: xlogreader.h:417
HotStandbyState standbyState
Definition: xlogutils.c:53
@ STANDBY_DISABLED
Definition: xlogutils.h:49

References Assert, xl_invalidations::dbId, xl_standby_lock::dbOid, elog, i, RunningTransactionsData::latestCompletedXid, xl_running_xacts::latestCompletedXid, xl_standby_locks::locks, xl_invalidations::msgs, RunningTransactionsData::nextXid, xl_running_xacts::nextXid, xl_standby_locks::nlocks, xl_invalidations::nmsgs, RunningTransactionsData::oldestRunningXid, xl_running_xacts::oldestRunningXid, PANIC, pgstat_report_stat(), ProcArrayApplyRecoveryInfo(), ProcessCommittedInvalidationMessages(), xl_invalidations::relcacheInitFileInval, xl_standby_lock::relOid, STANDBY_DISABLED, StandbyAcquireAccessExclusiveLock(), standbyState, RunningTransactionsData::subxcnt, xl_running_xacts::subxcnt, RunningTransactionsData::subxid_overflow, xl_running_xacts::subxid_overflow, xl_invalidations::tsId, RunningTransactionsData::xcnt, xl_running_xacts::xcnt, xl_standby_lock::xid, RunningTransactionsData::xids, xl_running_xacts::xids, XLOG_INVALIDATIONS, XLOG_RUNNING_XACTS, XLOG_STANDBY_LOCK, XLogRecGetData, XLogRecGetInfo, XLogRecHasAnyBlockRefs, and XLR_INFO_MASK.