PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
xactdesc.c File Reference
#include "postgres.h"
#include "access/transam.h"
#include "access/xact.h"
#include "replication/origin.h"
#include "storage/sinval.h"
#include "storage/standbydefs.h"
#include "utils/timestamp.h"
Include dependency graph for xactdesc.c:

Go to the source code of this file.

Functions

void ParseCommitRecord (uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
 
void ParseAbortRecord (uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
 
void ParsePrepareRecord (uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *parsed)
 
static void xact_desc_relations (StringInfo buf, char *label, int nrels, RelFileLocator *xlocators)
 
static void xact_desc_subxacts (StringInfo buf, int nsubxacts, TransactionId *subxacts)
 
static void xact_desc_stats (StringInfo buf, const char *label, int ndropped, xl_xact_stats_item *dropped_stats)
 
static void xact_desc_commit (StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
 
static void xact_desc_abort (StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId origin_id)
 
static void xact_desc_prepare (StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginId origin_id)
 
static void xact_desc_assignment (StringInfo buf, xl_xact_assignment *xlrec)
 
void xact_desc (StringInfo buf, XLogReaderState *record)
 
const char * xact_identify (uint8 info)
 

Function Documentation

◆ ParseAbortRecord()

void ParseAbortRecord ( uint8  info,
xl_xact_abort xlrec,
xl_xact_parsed_abort parsed 
)

Definition at line 141 of file xactdesc.c.

142{
143 char *data = ((char *) xlrec) + MinSizeOfXactAbort;
144
145 memset(parsed, 0, sizeof(*parsed));
146
147 parsed->xinfo = 0; /* default, if no XLOG_XACT_HAS_INFO is
148 * present */
149
150 parsed->xact_time = xlrec->xact_time;
151
152 if (info & XLOG_XACT_HAS_INFO)
153 {
154 xl_xact_xinfo *xl_xinfo = (xl_xact_xinfo *) data;
155
156 parsed->xinfo = xl_xinfo->xinfo;
157
158 data += sizeof(xl_xact_xinfo);
159 }
160
161 if (parsed->xinfo & XACT_XINFO_HAS_DBINFO)
162 {
163 xl_xact_dbinfo *xl_dbinfo = (xl_xact_dbinfo *) data;
164
165 parsed->dbId = xl_dbinfo->dbId;
166 parsed->tsId = xl_dbinfo->tsId;
167
168 data += sizeof(xl_xact_dbinfo);
169 }
170
171 if (parsed->xinfo & XACT_XINFO_HAS_SUBXACTS)
172 {
173 xl_xact_subxacts *xl_subxacts = (xl_xact_subxacts *) data;
174
175 parsed->nsubxacts = xl_subxacts->nsubxacts;
176 parsed->subxacts = xl_subxacts->subxacts;
177
179 data += parsed->nsubxacts * sizeof(TransactionId);
180 }
181
183 {
185
186 parsed->nrels = xl_rellocator->nrels;
187 parsed->xlocators = xl_rellocator->xlocators;
188
190 data += xl_rellocator->nrels * sizeof(RelFileLocator);
191 }
192
194 {
196
197 parsed->nstats = xl_drops->nitems;
198 parsed->stats = xl_drops->items;
199
201 data += xl_drops->nitems * sizeof(xl_xact_stats_item);
202 }
203
204 if (parsed->xinfo & XACT_XINFO_HAS_TWOPHASE)
205 {
206 xl_xact_twophase *xl_twophase = (xl_xact_twophase *) data;
207
208 parsed->twophase_xid = xl_twophase->xid;
209
210 data += sizeof(xl_xact_twophase);
211
212 if (parsed->xinfo & XACT_XINFO_HAS_GID)
213 {
214 strlcpy(parsed->twophase_gid, data, sizeof(parsed->twophase_gid));
215 data += strlen(data) + 1;
216 }
217 }
218
219 /* Note: no alignment is guaranteed after this point */
220
221 if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
222 {
223 xl_xact_origin xl_origin;
224
225 /* no alignment is guaranteed, so copy onto stack */
226 memcpy(&xl_origin, data, sizeof(xl_origin));
227
228 parsed->origin_lsn = xl_origin.origin_lsn;
229 parsed->origin_timestamp = xl_origin.origin_timestamp;
230
231 data += sizeof(xl_xact_origin);
232 }
233}
uint32 TransactionId
Definition: c.h:623
const void * data
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
struct RelFileLocator RelFileLocator
TimestampTz xact_time
Definition: xact.h:338
Oid tsId
Definition: xact.h:258
Oid dbId
Definition: xact.h:257
TimestampTz origin_timestamp
Definition: xact.h:317
XLogRecPtr origin_lsn
Definition: xact.h:316
xl_xact_stats_item * stats
Definition: xact.h:425
RelFileLocator * xlocators
Definition: xact.h:422
TransactionId twophase_xid
Definition: xact.h:427
TimestampTz xact_time
Definition: xact.h:412
TransactionId * subxacts
Definition: xact.h:419
XLogRecPtr origin_lsn
Definition: xact.h:430
char twophase_gid[GIDSIZE]
Definition: xact.h:428
TimestampTz origin_timestamp
Definition: xact.h:431
RelFileLocator xlocators[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:271
xl_xact_stats_item items[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:298
TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:264
int nsubxacts
Definition: xact.h:263
TransactionId xid
Definition: xact.h:311
uint32 xinfo
Definition: xact.h:252
struct xl_xact_stats_item xl_xact_stats_item
#define MinSizeOfXactSubxacts
Definition: xact.h:266
struct xl_xact_dbinfo xl_xact_dbinfo
#define XACT_XINFO_HAS_GID
Definition: xact.h:195
struct xl_xact_origin xl_xact_origin
#define XACT_XINFO_HAS_ORIGIN
Definition: xact.h:193
#define XACT_XINFO_HAS_TWOPHASE
Definition: xact.h:192
#define MinSizeOfXactRelfileLocators
Definition: xact.h:273
#define MinSizeOfXactStatsItems
Definition: xact.h:300
#define XACT_XINFO_HAS_RELFILELOCATORS
Definition: xact.h:190
#define MinSizeOfXactAbort
Definition: xact.h:350
struct xl_xact_xinfo xl_xact_xinfo
#define XACT_XINFO_HAS_DBINFO
Definition: xact.h:188
struct xl_xact_twophase xl_xact_twophase
#define XLOG_XACT_HAS_INFO
Definition: xact.h:182
#define XACT_XINFO_HAS_SUBXACTS
Definition: xact.h:189
#define XACT_XINFO_HAS_DROPPED_STATS
Definition: xact.h:196

References data, xl_xact_dbinfo::dbId, xl_xact_parsed_abort::dbId, xl_xact_stats_items::items, MinSizeOfXactAbort, MinSizeOfXactRelfileLocators, MinSizeOfXactStatsItems, MinSizeOfXactSubxacts, xl_xact_stats_items::nitems, xl_xact_relfilelocators::nrels, xl_xact_parsed_abort::nrels, xl_xact_parsed_abort::nstats, xl_xact_subxacts::nsubxacts, xl_xact_parsed_abort::nsubxacts, xl_xact_origin::origin_lsn, xl_xact_parsed_abort::origin_lsn, xl_xact_origin::origin_timestamp, xl_xact_parsed_abort::origin_timestamp, xl_xact_parsed_abort::stats, strlcpy(), xl_xact_subxacts::subxacts, xl_xact_parsed_abort::subxacts, xl_xact_dbinfo::tsId, xl_xact_parsed_abort::tsId, xl_xact_parsed_abort::twophase_gid, xl_xact_parsed_abort::twophase_xid, xl_xact_abort::xact_time, xl_xact_parsed_abort::xact_time, XACT_XINFO_HAS_DBINFO, XACT_XINFO_HAS_DROPPED_STATS, XACT_XINFO_HAS_GID, XACT_XINFO_HAS_ORIGIN, XACT_XINFO_HAS_RELFILELOCATORS, XACT_XINFO_HAS_SUBXACTS, XACT_XINFO_HAS_TWOPHASE, xl_xact_twophase::xid, xl_xact_xinfo::xinfo, xl_xact_parsed_abort::xinfo, xl_xact_relfilelocators::xlocators, xl_xact_parsed_abort::xlocators, and XLOG_XACT_HAS_INFO.

Referenced by recoveryStopsAfter(), recoveryStopsBefore(), SummarizeXactRecord(), xact_decode(), xact_desc_abort(), and xact_redo().

◆ ParseCommitRecord()

void ParseCommitRecord ( uint8  info,
xl_xact_commit xlrec,
xl_xact_parsed_commit parsed 
)

Definition at line 35 of file xactdesc.c.

36{
37 char *data = ((char *) xlrec) + MinSizeOfXactCommit;
38
39 memset(parsed, 0, sizeof(*parsed));
40
41 parsed->xinfo = 0; /* default, if no XLOG_XACT_HAS_INFO is
42 * present */
43
44 parsed->xact_time = xlrec->xact_time;
45
46 if (info & XLOG_XACT_HAS_INFO)
47 {
48 xl_xact_xinfo *xl_xinfo = (xl_xact_xinfo *) data;
49
50 parsed->xinfo = xl_xinfo->xinfo;
51
52 data += sizeof(xl_xact_xinfo);
53 }
54
55 if (parsed->xinfo & XACT_XINFO_HAS_DBINFO)
56 {
57 xl_xact_dbinfo *xl_dbinfo = (xl_xact_dbinfo *) data;
58
59 parsed->dbId = xl_dbinfo->dbId;
60 parsed->tsId = xl_dbinfo->tsId;
61
62 data += sizeof(xl_xact_dbinfo);
63 }
64
65 if (parsed->xinfo & XACT_XINFO_HAS_SUBXACTS)
66 {
67 xl_xact_subxacts *xl_subxacts = (xl_xact_subxacts *) data;
68
69 parsed->nsubxacts = xl_subxacts->nsubxacts;
70 parsed->subxacts = xl_subxacts->subxacts;
71
73 data += parsed->nsubxacts * sizeof(TransactionId);
74 }
75
77 {
79
80 parsed->nrels = xl_rellocators->nrels;
81 parsed->xlocators = xl_rellocators->xlocators;
82
84 data += xl_rellocators->nrels * sizeof(RelFileLocator);
85 }
86
88 {
90
91 parsed->nstats = xl_drops->nitems;
92 parsed->stats = xl_drops->items;
93
95 data += xl_drops->nitems * sizeof(xl_xact_stats_item);
96 }
97
98 if (parsed->xinfo & XACT_XINFO_HAS_INVALS)
99 {
100 xl_xact_invals *xl_invals = (xl_xact_invals *) data;
101
102 parsed->nmsgs = xl_invals->nmsgs;
103 parsed->msgs = xl_invals->msgs;
104
106 data += xl_invals->nmsgs * sizeof(SharedInvalidationMessage);
107 }
108
109 if (parsed->xinfo & XACT_XINFO_HAS_TWOPHASE)
110 {
111 xl_xact_twophase *xl_twophase = (xl_xact_twophase *) data;
112
113 parsed->twophase_xid = xl_twophase->xid;
114
115 data += sizeof(xl_xact_twophase);
116
117 if (parsed->xinfo & XACT_XINFO_HAS_GID)
118 {
119 strlcpy(parsed->twophase_gid, data, sizeof(parsed->twophase_gid));
120 data += strlen(data) + 1;
121 }
122 }
123
124 /* Note: no alignment is guaranteed after this point */
125
126 if (parsed->xinfo & XACT_XINFO_HAS_ORIGIN)
127 {
128 xl_xact_origin xl_origin;
129
130 /* no alignment is guaranteed, so copy onto stack */
131 memcpy(&xl_origin, data, sizeof(xl_origin));
132
133 parsed->origin_lsn = xl_origin.origin_lsn;
134 parsed->origin_timestamp = xl_origin.origin_timestamp;
135
136 data += sizeof(xl_xact_origin);
137 }
138}
TimestampTz xact_time
Definition: xact.h:322
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:305
int nmsgs
Definition: xact.h:304
xl_xact_stats_item * stats
Definition: xact.h:392
TimestampTz xact_time
Definition: xact.h:379
TransactionId twophase_xid
Definition: xact.h:397
RelFileLocator * xlocators
Definition: xact.h:389
TimestampTz origin_timestamp
Definition: xact.h:405
TransactionId * subxacts
Definition: xact.h:386
char twophase_gid[GIDSIZE]
Definition: xact.h:398
XLogRecPtr origin_lsn
Definition: xact.h:404
SharedInvalidationMessage * msgs
Definition: xact.h:395
#define MinSizeOfXactInvals
Definition: xact.h:307
#define MinSizeOfXactCommit
Definition: xact.h:334
#define XACT_XINFO_HAS_INVALS
Definition: xact.h:191

References data, xl_xact_dbinfo::dbId, xl_xact_parsed_commit::dbId, xl_xact_stats_items::items, MinSizeOfXactCommit, MinSizeOfXactInvals, MinSizeOfXactRelfileLocators, MinSizeOfXactStatsItems, MinSizeOfXactSubxacts, xl_xact_invals::msgs, xl_xact_parsed_commit::msgs, xl_xact_stats_items::nitems, xl_xact_invals::nmsgs, xl_xact_parsed_commit::nmsgs, xl_xact_relfilelocators::nrels, xl_xact_parsed_commit::nrels, xl_xact_parsed_commit::nstats, xl_xact_subxacts::nsubxacts, xl_xact_parsed_commit::nsubxacts, xl_xact_origin::origin_lsn, xl_xact_parsed_commit::origin_lsn, xl_xact_origin::origin_timestamp, xl_xact_parsed_commit::origin_timestamp, xl_xact_parsed_commit::stats, strlcpy(), xl_xact_subxacts::subxacts, xl_xact_parsed_commit::subxacts, xl_xact_dbinfo::tsId, xl_xact_parsed_commit::tsId, xl_xact_parsed_commit::twophase_gid, xl_xact_parsed_commit::twophase_xid, xl_xact_commit::xact_time, xl_xact_parsed_commit::xact_time, XACT_XINFO_HAS_DBINFO, XACT_XINFO_HAS_DROPPED_STATS, XACT_XINFO_HAS_GID, XACT_XINFO_HAS_INVALS, XACT_XINFO_HAS_ORIGIN, XACT_XINFO_HAS_RELFILELOCATORS, XACT_XINFO_HAS_SUBXACTS, XACT_XINFO_HAS_TWOPHASE, xl_xact_twophase::xid, xl_xact_xinfo::xinfo, xl_xact_parsed_commit::xinfo, xl_xact_relfilelocators::xlocators, xl_xact_parsed_commit::xlocators, and XLOG_XACT_HAS_INFO.

Referenced by recoveryStopsAfter(), recoveryStopsBefore(), SummarizeXactRecord(), xact_decode(), xact_desc_commit(), and xact_redo().

◆ ParsePrepareRecord()

void ParsePrepareRecord ( uint8  info,
xl_xact_prepare xlrec,
xl_xact_parsed_prepare parsed 
)

Definition at line 239 of file xactdesc.c.

240{
241 char *bufptr;
242
243 bufptr = ((char *) xlrec) + MAXALIGN(sizeof(xl_xact_prepare));
244
245 memset(parsed, 0, sizeof(*parsed));
246
247 parsed->xact_time = xlrec->prepared_at;
248 parsed->origin_lsn = xlrec->origin_lsn;
249 parsed->origin_timestamp = xlrec->origin_timestamp;
250 parsed->twophase_xid = xlrec->xid;
251 parsed->dbId = xlrec->database;
252 parsed->nsubxacts = xlrec->nsubxacts;
253 parsed->nrels = xlrec->ncommitrels;
254 parsed->nabortrels = xlrec->nabortrels;
255 parsed->nmsgs = xlrec->ninvalmsgs;
256
257 strncpy(parsed->twophase_gid, bufptr, xlrec->gidlen);
258 bufptr += MAXALIGN(xlrec->gidlen);
259
260 parsed->subxacts = (TransactionId *) bufptr;
261 bufptr += MAXALIGN(xlrec->nsubxacts * sizeof(TransactionId));
262
263 parsed->xlocators = (RelFileLocator *) bufptr;
264 bufptr += MAXALIGN(xlrec->ncommitrels * sizeof(RelFileLocator));
265
266 parsed->abortlocators = (RelFileLocator *) bufptr;
267 bufptr += MAXALIGN(xlrec->nabortrels * sizeof(RelFileLocator));
268
269 parsed->stats = (xl_xact_stats_item *) bufptr;
270 bufptr += MAXALIGN(xlrec->ncommitstats * sizeof(xl_xact_stats_item));
271
272 parsed->abortstats = (xl_xact_stats_item *) bufptr;
273 bufptr += MAXALIGN(xlrec->nabortstats * sizeof(xl_xact_stats_item));
274
275 parsed->msgs = (SharedInvalidationMessage *) bufptr;
276 bufptr += MAXALIGN(xlrec->ninvalmsgs * sizeof(SharedInvalidationMessage));
277}
#define MAXALIGN(LEN)
Definition: c.h:782
RelFileLocator * abortlocators
Definition: xact.h:400
xl_xact_stats_item * abortstats
Definition: xact.h:402
TimestampTz prepared_at
Definition: xact.h:358
int32 nabortrels
Definition: xact.h:362
int32 ninvalmsgs
Definition: xact.h:365
int32 ncommitstats
Definition: xact.h:363
TimestampTz origin_timestamp
Definition: xact.h:369
uint16 gidlen
Definition: xact.h:367
int32 nabortstats
Definition: xact.h:364
Oid database
Definition: xact.h:357
XLogRecPtr origin_lsn
Definition: xact.h:368
int32 ncommitrels
Definition: xact.h:361
TransactionId xid
Definition: xact.h:356
int32 nsubxacts
Definition: xact.h:360

References xl_xact_parsed_commit::abortlocators, xl_xact_parsed_commit::abortstats, xl_xact_prepare::database, xl_xact_parsed_commit::dbId, xl_xact_prepare::gidlen, MAXALIGN, xl_xact_parsed_commit::msgs, xl_xact_prepare::nabortrels, xl_xact_parsed_commit::nabortrels, xl_xact_prepare::nabortstats, xl_xact_prepare::ncommitrels, xl_xact_prepare::ncommitstats, xl_xact_prepare::ninvalmsgs, xl_xact_parsed_commit::nmsgs, xl_xact_parsed_commit::nrels, xl_xact_prepare::nsubxacts, xl_xact_parsed_commit::nsubxacts, xl_xact_prepare::origin_lsn, xl_xact_parsed_commit::origin_lsn, xl_xact_prepare::origin_timestamp, xl_xact_parsed_commit::origin_timestamp, xl_xact_prepare::prepared_at, xl_xact_parsed_commit::stats, xl_xact_parsed_commit::subxacts, xl_xact_parsed_commit::twophase_gid, xl_xact_parsed_commit::twophase_xid, xl_xact_parsed_commit::xact_time, xl_xact_prepare::xid, and xl_xact_parsed_commit::xlocators.

Referenced by xact_decode(), and xact_desc_prepare().

◆ xact_desc()

void xact_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 437 of file xactdesc.c.

438{
439 char *rec = XLogRecGetData(record);
440 uint8 info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
441
442 if (info == XLOG_XACT_COMMIT || info == XLOG_XACT_COMMIT_PREPARED)
443 {
444 xl_xact_commit *xlrec = (xl_xact_commit *) rec;
445
446 xact_desc_commit(buf, XLogRecGetInfo(record), xlrec,
447 XLogRecGetOrigin(record));
448 }
449 else if (info == XLOG_XACT_ABORT || info == XLOG_XACT_ABORT_PREPARED)
450 {
451 xl_xact_abort *xlrec = (xl_xact_abort *) rec;
452
453 xact_desc_abort(buf, XLogRecGetInfo(record), xlrec,
454 XLogRecGetOrigin(record));
455 }
456 else if (info == XLOG_XACT_PREPARE)
457 {
458 xl_xact_prepare *xlrec = (xl_xact_prepare *) rec;
459
460 xact_desc_prepare(buf, XLogRecGetInfo(record), xlrec,
461 XLogRecGetOrigin(record));
462 }
463 else if (info == XLOG_XACT_ASSIGNMENT)
464 {
465 xl_xact_assignment *xlrec = (xl_xact_assignment *) rec;
466
467 /*
468 * Note that we ignore the WAL record's xid, since we're more
469 * interested in the top-level xid that issued the record and which
470 * xids are being reported here.
471 */
472 appendStringInfo(buf, "xtop %u: ", xlrec->xtop);
474 }
475 else if (info == XLOG_XACT_INVALIDATIONS)
476 {
477 xl_xact_invals *xlrec = (xl_xact_invals *) rec;
478
480 InvalidOid, false);
481 }
482}
uint8_t uint8
Definition: c.h:500
static char * buf
Definition: pg_test_fsync.c:72
#define InvalidOid
Definition: postgres_ext.h:37
void standby_desc_invalidations(StringInfo buf, int nmsgs, SharedInvalidationMessage *msgs, Oid dbId, Oid tsId, bool relcacheInitFileInval)
Definition: standbydesc.c:101
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
TransactionId xtop
Definition: xact.h:220
#define XLOG_XACT_COMMIT_PREPARED
Definition: xact.h:172
#define XLOG_XACT_INVALIDATIONS
Definition: xact.h:175
#define XLOG_XACT_PREPARE
Definition: xact.h:170
#define XLOG_XACT_COMMIT
Definition: xact.h:169
#define XLOG_XACT_OPMASK
Definition: xact.h:179
#define XLOG_XACT_ABORT
Definition: xact.h:171
#define XLOG_XACT_ASSIGNMENT
Definition: xact.h:174
#define XLOG_XACT_ABORT_PREPARED
Definition: xact.h:173
static void xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:332
static void xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:368
static void xact_desc_assignment(StringInfo buf, xl_xact_assignment *xlrec)
Definition: xactdesc.c:426
static void xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:395
#define XLogRecGetOrigin(decoder)
Definition: xlogreader.h:413
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415

References appendStringInfo(), buf, InvalidOid, xl_xact_invals::msgs, xl_xact_invals::nmsgs, standby_desc_invalidations(), xact_desc_abort(), xact_desc_assignment(), xact_desc_commit(), xact_desc_prepare(), XLOG_XACT_ABORT, XLOG_XACT_ABORT_PREPARED, XLOG_XACT_ASSIGNMENT, XLOG_XACT_COMMIT, XLOG_XACT_COMMIT_PREPARED, XLOG_XACT_INVALIDATIONS, XLOG_XACT_OPMASK, XLOG_XACT_PREPARE, XLogRecGetData, XLogRecGetInfo, XLogRecGetOrigin, and xl_xact_assignment::xtop.

◆ xact_desc_abort()

static void xact_desc_abort ( StringInfo  buf,
uint8  info,
xl_xact_abort xlrec,
RepOriginId  origin_id 
)
static

Definition at line 368 of file xactdesc.c.

369{
371
372 ParseAbortRecord(info, xlrec, &parsed);
373
374 /* If this is a prepared xact, show the xid of the original xact */
376 appendStringInfo(buf, "%u: ", parsed.twophase_xid);
377
379
380 xact_desc_relations(buf, "rels", parsed.nrels, parsed.xlocators);
381 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
382
383 if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
384 {
385 appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
386 origin_id,
389 }
390
391 xact_desc_stats(buf, "", parsed.nstats, parsed.stats);
392}
const char * timestamptz_to_str(TimestampTz t)
Definition: timestamp.c:1861
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230
#define TransactionIdIsValid(xid)
Definition: transam.h:41
static void xact_desc_stats(StringInfo buf, const char *label, int ndropped, xl_xact_stats_item *dropped_stats)
Definition: xactdesc.c:310
static void xact_desc_relations(StringInfo buf, char *label, int nrels, RelFileLocator *xlocators)
Definition: xactdesc.c:280
static void xact_desc_subxacts(StringInfo buf, int nsubxacts, TransactionId *subxacts)
Definition: xactdesc.c:297
void ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
Definition: xactdesc.c:141
#define LSN_FORMAT_ARGS(lsn)
Definition: xlogdefs.h:43

References appendStringInfo(), appendStringInfoString(), buf, LSN_FORMAT_ARGS, xl_xact_parsed_abort::nrels, xl_xact_parsed_abort::nstats, xl_xact_parsed_abort::nsubxacts, xl_xact_parsed_abort::origin_lsn, xl_xact_parsed_abort::origin_timestamp, ParseAbortRecord(), xl_xact_parsed_abort::stats, xl_xact_parsed_abort::subxacts, timestamptz_to_str(), TransactionIdIsValid, xl_xact_parsed_abort::twophase_xid, xact_desc_relations(), xact_desc_stats(), xact_desc_subxacts(), xl_xact_abort::xact_time, XACT_XINFO_HAS_ORIGIN, xl_xact_parsed_abort::xinfo, and xl_xact_parsed_abort::xlocators.

Referenced by xact_desc().

◆ xact_desc_assignment()

static void xact_desc_assignment ( StringInfo  buf,
xl_xact_assignment xlrec 
)
static

Definition at line 426 of file xactdesc.c.

427{
428 int i;
429
430 appendStringInfoString(buf, "subxacts:");
431
432 for (i = 0; i < xlrec->nsubxacts; i++)
433 appendStringInfo(buf, " %u", xlrec->xsub[i]);
434}
int i
Definition: isn.c:72
TransactionId xsub[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:222

References appendStringInfo(), appendStringInfoString(), buf, i, xl_xact_assignment::nsubxacts, and xl_xact_assignment::xsub.

Referenced by xact_desc().

◆ xact_desc_commit()

static void xact_desc_commit ( StringInfo  buf,
uint8  info,
xl_xact_commit xlrec,
RepOriginId  origin_id 
)
static

Definition at line 332 of file xactdesc.c.

333{
335
336 ParseCommitRecord(info, xlrec, &parsed);
337
338 /* If this is a prepared xact, show the xid of the original xact */
340 appendStringInfo(buf, "%u: ", parsed.twophase_xid);
341
343
344 xact_desc_relations(buf, "rels", parsed.nrels, parsed.xlocators);
345 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
346 xact_desc_stats(buf, "", parsed.nstats, parsed.stats);
347
348 standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId,
349 parsed.tsId,
351
353 appendStringInfoString(buf, "; apply_feedback");
354
356 appendStringInfoString(buf, "; sync");
357
358 if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
359 {
360 appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
361 origin_id,
364 }
365}
#define XactCompletionForceSyncCommit(xinfo)
Definition: xact.h:215
#define XactCompletionApplyFeedback(xinfo)
Definition: xact.h:211
#define XactCompletionRelcacheInitFileInval(xinfo)
Definition: xact.h:213
void ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
Definition: xactdesc.c:35

References appendStringInfo(), appendStringInfoString(), buf, xl_xact_parsed_commit::dbId, LSN_FORMAT_ARGS, xl_xact_parsed_commit::msgs, xl_xact_parsed_commit::nmsgs, xl_xact_parsed_commit::nrels, xl_xact_parsed_commit::nstats, xl_xact_parsed_commit::nsubxacts, xl_xact_parsed_commit::origin_lsn, xl_xact_parsed_commit::origin_timestamp, ParseCommitRecord(), standby_desc_invalidations(), xl_xact_parsed_commit::stats, xl_xact_parsed_commit::subxacts, timestamptz_to_str(), TransactionIdIsValid, xl_xact_parsed_commit::tsId, xl_xact_parsed_commit::twophase_xid, xact_desc_relations(), xact_desc_stats(), xact_desc_subxacts(), xl_xact_commit::xact_time, XACT_XINFO_HAS_ORIGIN, XactCompletionApplyFeedback, XactCompletionForceSyncCommit, XactCompletionRelcacheInitFileInval, xl_xact_parsed_commit::xinfo, and xl_xact_parsed_commit::xlocators.

Referenced by xact_desc().

◆ xact_desc_prepare()

static void xact_desc_prepare ( StringInfo  buf,
uint8  info,
xl_xact_prepare xlrec,
RepOriginId  origin_id 
)
static

Definition at line 395 of file xactdesc.c.

396{
398
399 ParsePrepareRecord(info, xlrec, &parsed);
400
401 appendStringInfo(buf, "gid %s: ", parsed.twophase_gid);
403
404 xact_desc_relations(buf, "rels(commit)", parsed.nrels, parsed.xlocators);
405 xact_desc_relations(buf, "rels(abort)", parsed.nabortrels,
406 parsed.abortlocators);
407 xact_desc_stats(buf, "commit ", parsed.nstats, parsed.stats);
408 xact_desc_stats(buf, "abort ", parsed.nabortstats, parsed.abortstats);
409 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
410
411 standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId,
412 parsed.tsId, xlrec->initfileinval);
413
414 /*
415 * Check if the replication origin has been set in this record in the same
416 * way as PrepareRedoAdd().
417 */
418 if (origin_id != InvalidRepOriginId)
419 appendStringInfo(buf, "; origin: node %u, lsn %X/%X, at %s",
420 origin_id,
423}
#define InvalidRepOriginId
Definition: origin.h:33
bool initfileinval
Definition: xact.h:366
void ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *parsed)
Definition: xactdesc.c:239

References xl_xact_parsed_commit::abortlocators, xl_xact_parsed_commit::abortstats, appendStringInfo(), appendStringInfoString(), buf, xl_xact_parsed_commit::dbId, xl_xact_prepare::initfileinval, InvalidRepOriginId, LSN_FORMAT_ARGS, xl_xact_parsed_commit::msgs, xl_xact_parsed_commit::nabortrels, xl_xact_parsed_commit::nabortstats, xl_xact_parsed_commit::nmsgs, xl_xact_parsed_commit::nrels, xl_xact_parsed_commit::nstats, xl_xact_parsed_commit::nsubxacts, xl_xact_parsed_commit::origin_lsn, xl_xact_parsed_commit::origin_timestamp, ParsePrepareRecord(), standby_desc_invalidations(), xl_xact_parsed_commit::stats, xl_xact_parsed_commit::subxacts, timestamptz_to_str(), xl_xact_parsed_commit::tsId, xl_xact_parsed_commit::twophase_gid, xact_desc_relations(), xact_desc_stats(), xact_desc_subxacts(), xl_xact_parsed_commit::xact_time, and xl_xact_parsed_commit::xlocators.

Referenced by xact_desc().

◆ xact_desc_relations()

static void xact_desc_relations ( StringInfo  buf,
char *  label,
int  nrels,
RelFileLocator xlocators 
)
static

Definition at line 280 of file xactdesc.c.

282{
283 int i;
284
285 if (nrels > 0)
286 {
287 appendStringInfo(buf, "; %s:", label);
288 for (i = 0; i < nrels; i++)
289 {
290 appendStringInfo(buf, " %s",
291 relpathperm(xlocators[i], MAIN_FORKNUM).str);
292 }
293 }
294}
const char * str
static char * label
@ MAIN_FORKNUM
Definition: relpath.h:58
#define relpathperm(rlocator, forknum)
Definition: relpath.h:146

References appendStringInfo(), buf, i, label, MAIN_FORKNUM, relpathperm, and str.

Referenced by xact_desc_abort(), xact_desc_commit(), and xact_desc_prepare().

◆ xact_desc_stats()

static void xact_desc_stats ( StringInfo  buf,
const char *  label,
int  ndropped,
xl_xact_stats_item dropped_stats 
)
static

Definition at line 310 of file xactdesc.c.

312{
313 int i;
314
315 if (ndropped > 0)
316 {
317 appendStringInfo(buf, "; %sdropped stats:", label);
318 for (i = 0; i < ndropped; i++)
319 {
320 uint64 objid =
321 ((uint64) dropped_stats[i].objid_hi) << 32 | dropped_stats[i].objid_lo;
322
323 appendStringInfo(buf, " %d/%u/%llu",
324 dropped_stats[i].kind,
325 dropped_stats[i].dboid,
326 (unsigned long long) objid);
327 }
328 }
329}
uint64_t uint64
Definition: c.h:503
uint32 objid_lo
Definition: xact.h:291

References appendStringInfo(), buf, i, label, and xl_xact_stats_item::objid_lo.

Referenced by xact_desc_abort(), xact_desc_commit(), and xact_desc_prepare().

◆ xact_desc_subxacts()

static void xact_desc_subxacts ( StringInfo  buf,
int  nsubxacts,
TransactionId subxacts 
)
static

Definition at line 297 of file xactdesc.c.

298{
299 int i;
300
301 if (nsubxacts > 0)
302 {
303 appendStringInfoString(buf, "; subxacts:");
304 for (i = 0; i < nsubxacts; i++)
305 appendStringInfo(buf, " %u", subxacts[i]);
306 }
307}

References appendStringInfo(), appendStringInfoString(), buf, and i.

Referenced by xact_desc_abort(), xact_desc_commit(), and xact_desc_prepare().

◆ xact_identify()

const char * xact_identify ( uint8  info)

Definition at line 485 of file xactdesc.c.

486{
487 const char *id = NULL;
488
489 switch (info & XLOG_XACT_OPMASK)
490 {
491 case XLOG_XACT_COMMIT:
492 id = "COMMIT";
493 break;
495 id = "PREPARE";
496 break;
497 case XLOG_XACT_ABORT:
498 id = "ABORT";
499 break;
501 id = "COMMIT_PREPARED";
502 break;
504 id = "ABORT_PREPARED";
505 break;
507 id = "ASSIGNMENT";
508 break;
510 id = "INVALIDATION";
511 break;
512 }
513
514 return id;
515}

References XLOG_XACT_ABORT, XLOG_XACT_ABORT_PREPARED, XLOG_XACT_ASSIGNMENT, XLOG_XACT_COMMIT, XLOG_XACT_COMMIT_PREPARED, XLOG_XACT_INVALIDATIONS, XLOG_XACT_OPMASK, and XLOG_XACT_PREPARE.