PostgreSQL Source Code: src/backend/access/rmgrdesc/xactdesc.c Source File

PostgreSQL Source Code git master
xactdesc.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * xactdesc.c
4 * rmgr descriptor routines for access/transam/xact.c
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/access/rmgrdesc/xactdesc.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres.h"
16
17#include "access/transam.h"
18#include "access/xact.h"
19#include "replication/origin.h"
20#include "storage/sinval.h"
21#include "storage/standbydefs.h"
22#include "utils/timestamp.h"
23
24/*
25 * Parse the WAL format of an xact commit and abort records into an easier to
26 * understand format.
27 *
28 * These routines are in xactdesc.c because they're accessed in backend (when
29 * replaying WAL) and frontend (pg_waldump) code. This file is the only xact
30 * specific one shared between both. They're complicated enough that
31 * duplication would be bothersome.
32 */
33
34void
35 ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
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
72 data += MinSizeOfXactSubxacts;
73 data += parsed->nsubxacts * sizeof(TransactionId);
74 }
75
76 if (parsed->xinfo & XACT_XINFO_HAS_RELFILELOCATORS)
77 {
78 xl_xact_relfilelocators *xl_rellocators = (xl_xact_relfilelocators *) data;
79
80 parsed->nrels = xl_rellocators->nrels;
81 parsed->xlocators = xl_rellocators->xlocators;
82
83 data += MinSizeOfXactRelfileLocators;
84 data += xl_rellocators->nrels * sizeof(RelFileLocator);
85 }
86
87 if (parsed->xinfo & XACT_XINFO_HAS_DROPPED_STATS)
88 {
89 xl_xact_stats_items *xl_drops = (xl_xact_stats_items *) data;
90
91 parsed->nstats = xl_drops->nitems;
92 parsed->stats = xl_drops->items;
93
94 data += MinSizeOfXactStatsItems;
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
105 data += MinSizeOfXactInvals;
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}
139
140void
141 ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
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
178 data += MinSizeOfXactSubxacts;
179 data += parsed->nsubxacts * sizeof(TransactionId);
180 }
181
182 if (parsed->xinfo & XACT_XINFO_HAS_RELFILELOCATORS)
183 {
184 xl_xact_relfilelocators *xl_rellocator = (xl_xact_relfilelocators *) data;
185
186 parsed->nrels = xl_rellocator->nrels;
187 parsed->xlocators = xl_rellocator->xlocators;
188
189 data += MinSizeOfXactRelfileLocators;
190 data += xl_rellocator->nrels * sizeof(RelFileLocator);
191 }
192
193 if (parsed->xinfo & XACT_XINFO_HAS_DROPPED_STATS)
194 {
195 xl_xact_stats_items *xl_drops = (xl_xact_stats_items *) data;
196
197 parsed->nstats = xl_drops->nitems;
198 parsed->stats = xl_drops->items;
199
200 data += MinSizeOfXactStatsItems;
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}
234
235/*
236 * ParsePrepareRecord
237 */
238void
239 ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *parsed)
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->nstats = xlrec->ncommitstats;
256 parsed->nabortstats = xlrec->nabortstats;
257 parsed->nmsgs = xlrec->ninvalmsgs;
258
259 strncpy(parsed->twophase_gid, bufptr, xlrec->gidlen);
260 bufptr += MAXALIGN(xlrec->gidlen);
261
262 parsed->subxacts = (TransactionId *) bufptr;
263 bufptr += MAXALIGN(xlrec->nsubxacts * sizeof(TransactionId));
264
265 parsed->xlocators = (RelFileLocator *) bufptr;
266 bufptr += MAXALIGN(xlrec->ncommitrels * sizeof(RelFileLocator));
267
268 parsed->abortlocators = (RelFileLocator *) bufptr;
269 bufptr += MAXALIGN(xlrec->nabortrels * sizeof(RelFileLocator));
270
271 parsed->stats = (xl_xact_stats_item *) bufptr;
272 bufptr += MAXALIGN(xlrec->ncommitstats * sizeof(xl_xact_stats_item));
273
274 parsed->abortstats = (xl_xact_stats_item *) bufptr;
275 bufptr += MAXALIGN(xlrec->nabortstats * sizeof(xl_xact_stats_item));
276
277 parsed->msgs = (SharedInvalidationMessage *) bufptr;
278 bufptr += MAXALIGN(xlrec->ninvalmsgs * sizeof(SharedInvalidationMessage));
279}
280
281static void
282 xact_desc_relations(StringInfo buf, char *label, int nrels,
283 RelFileLocator *xlocators)
284{
285 int i;
286
287 if (nrels > 0)
288 {
289 appendStringInfo(buf, "; %s:", label);
290 for (i = 0; i < nrels; i++)
291 {
292 appendStringInfo(buf, " %s",
293 relpathperm(xlocators[i], MAIN_FORKNUM).str);
294 }
295 }
296}
297
298static void
299 xact_desc_subxacts(StringInfo buf, int nsubxacts, TransactionId *subxacts)
300{
301 int i;
302
303 if (nsubxacts > 0)
304 {
305 appendStringInfoString(buf, "; subxacts:");
306 for (i = 0; i < nsubxacts; i++)
307 appendStringInfo(buf, " %u", subxacts[i]);
308 }
309}
310
311static void
312 xact_desc_stats(StringInfo buf, const char *label,
313 int ndropped, xl_xact_stats_item *dropped_stats)
314{
315 int i;
316
317 if (ndropped > 0)
318 {
319 appendStringInfo(buf, "; %sdropped stats:", label);
320 for (i = 0; i < ndropped; i++)
321 {
322 uint64 objid =
323 ((uint64) dropped_stats[i].objid_hi) << 32 | dropped_stats[i].objid_lo;
324
325 appendStringInfo(buf, " %d/%u/%" PRIu64,
326 dropped_stats[i].kind,
327 dropped_stats[i].dboid,
328 objid);
329 }
330 }
331}
332
333static void
334 xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
335{
336 xl_xact_parsed_commit parsed;
337
338 ParseCommitRecord(info, xlrec, &parsed);
339
340 /* If this is a prepared xact, show the xid of the original xact */
341 if (TransactionIdIsValid(parsed.twophase_xid))
342 appendStringInfo(buf, "%u: ", parsed.twophase_xid);
343
344 appendStringInfoString(buf, timestamptz_to_str(xlrec->xact_time));
345
346 xact_desc_relations(buf, "rels", parsed.nrels, parsed.xlocators);
347 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
348 xact_desc_stats(buf, "", parsed.nstats, parsed.stats);
349
350 standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId,
351 parsed.tsId,
352 XactCompletionRelcacheInitFileInval(parsed.xinfo));
353
354 if (XactCompletionApplyFeedback(parsed.xinfo))
355 appendStringInfoString(buf, "; apply_feedback");
356
357 if (XactCompletionForceSyncCommit(parsed.xinfo))
358 appendStringInfoString(buf, "; sync");
359
360 if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
361 {
362 appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
363 origin_id,
364 LSN_FORMAT_ARGS(parsed.origin_lsn),
365 timestamptz_to_str(parsed.origin_timestamp));
366 }
367}
368
369static void
370 xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId origin_id)
371{
372 xl_xact_parsed_abort parsed;
373
374 ParseAbortRecord(info, xlrec, &parsed);
375
376 /* If this is a prepared xact, show the xid of the original xact */
377 if (TransactionIdIsValid(parsed.twophase_xid))
378 appendStringInfo(buf, "%u: ", parsed.twophase_xid);
379
380 appendStringInfoString(buf, timestamptz_to_str(xlrec->xact_time));
381
382 xact_desc_relations(buf, "rels", parsed.nrels, parsed.xlocators);
383 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
384
385 if (parsed.xinfo & XACT_XINFO_HAS_ORIGIN)
386 {
387 appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
388 origin_id,
389 LSN_FORMAT_ARGS(parsed.origin_lsn),
390 timestamptz_to_str(parsed.origin_timestamp));
391 }
392
393 xact_desc_stats(buf, "", parsed.nstats, parsed.stats);
394}
395
396static void
397 xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginId origin_id)
398{
399 xl_xact_parsed_prepare parsed;
400
401 ParsePrepareRecord(info, xlrec, &parsed);
402
403 appendStringInfo(buf, "gid %s: ", parsed.twophase_gid);
404 appendStringInfoString(buf, timestamptz_to_str(parsed.xact_time));
405
406 xact_desc_relations(buf, "rels(commit)", parsed.nrels, parsed.xlocators);
407 xact_desc_relations(buf, "rels(abort)", parsed.nabortrels,
408 parsed.abortlocators);
409 xact_desc_stats(buf, "commit ", parsed.nstats, parsed.stats);
410 xact_desc_stats(buf, "abort ", parsed.nabortstats, parsed.abortstats);
411 xact_desc_subxacts(buf, parsed.nsubxacts, parsed.subxacts);
412
413 standby_desc_invalidations(buf, parsed.nmsgs, parsed.msgs, parsed.dbId,
414 parsed.tsId, xlrec->initfileinval);
415
416 /*
417 * Check if the replication origin has been set in this record in the same
418 * way as PrepareRedoAdd().
419 */
420 if (origin_id != InvalidRepOriginId)
421 appendStringInfo(buf, "; origin: node %u, lsn %X/%08X, at %s",
422 origin_id,
423 LSN_FORMAT_ARGS(parsed.origin_lsn),
424 timestamptz_to_str(parsed.origin_timestamp));
425}
426
427static void
428 xact_desc_assignment(StringInfo buf, xl_xact_assignment *xlrec)
429{
430 int i;
431
432 appendStringInfoString(buf, "subxacts:");
433
434 for (i = 0; i < xlrec->nsubxacts; i++)
435 appendStringInfo(buf, " %u", xlrec->xsub[i]);
436}
437
438void
439 xact_desc(StringInfo buf, XLogReaderState *record)
440{
441 char *rec = XLogRecGetData(record);
442 uint8 info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
443
444 if (info == XLOG_XACT_COMMIT || info == XLOG_XACT_COMMIT_PREPARED)
445 {
446 xl_xact_commit *xlrec = (xl_xact_commit *) rec;
447
448 xact_desc_commit(buf, XLogRecGetInfo(record), xlrec,
449 XLogRecGetOrigin(record));
450 }
451 else if (info == XLOG_XACT_ABORT || info == XLOG_XACT_ABORT_PREPARED)
452 {
453 xl_xact_abort *xlrec = (xl_xact_abort *) rec;
454
455 xact_desc_abort(buf, XLogRecGetInfo(record), xlrec,
456 XLogRecGetOrigin(record));
457 }
458 else if (info == XLOG_XACT_PREPARE)
459 {
460 xl_xact_prepare *xlrec = (xl_xact_prepare *) rec;
461
462 xact_desc_prepare(buf, XLogRecGetInfo(record), xlrec,
463 XLogRecGetOrigin(record));
464 }
465 else if (info == XLOG_XACT_ASSIGNMENT)
466 {
467 xl_xact_assignment *xlrec = (xl_xact_assignment *) rec;
468
469 /*
470 * Note that we ignore the WAL record's xid, since we're more
471 * interested in the top-level xid that issued the record and which
472 * xids are being reported here.
473 */
474 appendStringInfo(buf, "xtop %u: ", xlrec->xtop);
475 xact_desc_assignment(buf, xlrec);
476 }
477 else if (info == XLOG_XACT_INVALIDATIONS)
478 {
479 xl_xact_invals *xlrec = (xl_xact_invals *) rec;
480
481 standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs, InvalidOid,
482 InvalidOid, false);
483 }
484}
485
486const char *
487 xact_identify(uint8 info)
488{
489 const char *id = NULL;
490
491 switch (info & XLOG_XACT_OPMASK)
492 {
493 case XLOG_XACT_COMMIT:
494 id = "COMMIT";
495 break;
496 case XLOG_XACT_PREPARE:
497 id = "PREPARE";
498 break;
499 case XLOG_XACT_ABORT:
500 id = "ABORT";
501 break;
502 case XLOG_XACT_COMMIT_PREPARED:
503 id = "COMMIT_PREPARED";
504 break;
505 case XLOG_XACT_ABORT_PREPARED:
506 id = "ABORT_PREPARED";
507 break;
508 case XLOG_XACT_ASSIGNMENT:
509 id = "ASSIGNMENT";
510 break;
511 case XLOG_XACT_INVALIDATIONS:
512 id = "INVALIDATION";
513 break;
514 }
515
516 return id;
517}
const char * timestamptz_to_str(TimestampTz t)
Definition: timestamp.c:1862
#define MAXALIGN(LEN)
Definition: c.h:810
uint8_t uint8
Definition: c.h:536
uint64_t uint64
Definition: c.h:539
uint32 TransactionId
Definition: c.h:657
const char * str
i
int i
Definition: isn.c:77
#define InvalidRepOriginId
Definition: origin.h:33
static char * label
Definition: pg_basebackup.c:135
const void * data
static char * buf
Definition: pg_test_fsync.c:72
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
#define InvalidOid
Definition: postgres_ext.h:37
struct RelFileLocator RelFileLocator
@ MAIN_FORKNUM
Definition: relpath.h:58
#define relpathperm(rlocator, forknum)
Definition: relpath.h:146
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
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230
TimestampTz xact_time
Definition: xact.h:339
TransactionId xtop
Definition: xact.h:221
TransactionId xsub[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:223
int nsubxacts
Definition: xact.h:222
TimestampTz xact_time
Definition: xact.h:323
Oid tsId
Definition: xact.h:259
Oid dbId
Definition: xact.h:258
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:306
int nmsgs
Definition: xact.h:305
TimestampTz origin_timestamp
Definition: xact.h:318
XLogRecPtr origin_lsn
Definition: xact.h:317
xl_xact_stats_item * stats
Definition: xact.h:426
RelFileLocator * xlocators
Definition: xact.h:423
TransactionId twophase_xid
Definition: xact.h:428
TimestampTz xact_time
Definition: xact.h:413
TransactionId * subxacts
Definition: xact.h:420
uint32 xinfo
Definition: xact.h:414
XLogRecPtr origin_lsn
Definition: xact.h:431
char twophase_gid[GIDSIZE]
Definition: xact.h:429
TimestampTz origin_timestamp
Definition: xact.h:432
xl_xact_stats_item * stats
Definition: xact.h:393
TimestampTz xact_time
Definition: xact.h:380
TransactionId twophase_xid
Definition: xact.h:398
RelFileLocator * xlocators
Definition: xact.h:390
RelFileLocator * abortlocators
Definition: xact.h:401
TimestampTz origin_timestamp
Definition: xact.h:406
TransactionId * subxacts
Definition: xact.h:387
uint32 xinfo
Definition: xact.h:381
char twophase_gid[GIDSIZE]
Definition: xact.h:399
XLogRecPtr origin_lsn
Definition: xact.h:405
xl_xact_stats_item * abortstats
Definition: xact.h:403
SharedInvalidationMessage * msgs
Definition: xact.h:396
TimestampTz prepared_at
Definition: xact.h:359
int32 nabortrels
Definition: xact.h:363
int32 ninvalmsgs
Definition: xact.h:366
bool initfileinval
Definition: xact.h:367
int32 ncommitstats
Definition: xact.h:364
TimestampTz origin_timestamp
Definition: xact.h:370
uint16 gidlen
Definition: xact.h:368
int32 nabortstats
Definition: xact.h:365
Oid database
Definition: xact.h:358
XLogRecPtr origin_lsn
Definition: xact.h:369
int32 ncommitrels
Definition: xact.h:362
TransactionId xid
Definition: xact.h:357
int32 nsubxacts
Definition: xact.h:361
RelFileLocator xlocators[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:272
uint32 objid_lo
Definition: xact.h:292
xl_xact_stats_item items[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:299
TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER]
Definition: xact.h:265
int nsubxacts
Definition: xact.h:264
TransactionId xid
Definition: xact.h:312
uint32 xinfo
Definition: xact.h:253
#define TransactionIdIsValid(xid)
Definition: transam.h:41
struct xl_xact_stats_item xl_xact_stats_item
#define XactCompletionForceSyncCommit(xinfo)
Definition: xact.h:216
#define MinSizeOfXactInvals
Definition: xact.h:308
#define MinSizeOfXactSubxacts
Definition: xact.h:267
#define XLOG_XACT_COMMIT_PREPARED
Definition: xact.h:173
#define XLOG_XACT_INVALIDATIONS
Definition: xact.h:176
struct xl_xact_dbinfo xl_xact_dbinfo
#define XACT_XINFO_HAS_GID
Definition: xact.h:196
struct xl_xact_origin xl_xact_origin
#define XACT_XINFO_HAS_ORIGIN
Definition: xact.h:194
#define XLOG_XACT_PREPARE
Definition: xact.h:171
#define XACT_XINFO_HAS_TWOPHASE
Definition: xact.h:193
#define XLOG_XACT_COMMIT
Definition: xact.h:170
#define XLOG_XACT_OPMASK
Definition: xact.h:180
#define MinSizeOfXactCommit
Definition: xact.h:335
#define MinSizeOfXactRelfileLocators
Definition: xact.h:274
#define XLOG_XACT_ABORT
Definition: xact.h:172
#define MinSizeOfXactStatsItems
Definition: xact.h:301
#define XACT_XINFO_HAS_RELFILELOCATORS
Definition: xact.h:191
#define MinSizeOfXactAbort
Definition: xact.h:351
struct xl_xact_xinfo xl_xact_xinfo
#define XACT_XINFO_HAS_DBINFO
Definition: xact.h:189
#define XactCompletionApplyFeedback(xinfo)
Definition: xact.h:212
#define XLOG_XACT_ASSIGNMENT
Definition: xact.h:175
#define XACT_XINFO_HAS_INVALS
Definition: xact.h:192
struct xl_xact_twophase xl_xact_twophase
#define XLOG_XACT_ABORT_PREPARED
Definition: xact.h:174
#define XLOG_XACT_HAS_INFO
Definition: xact.h:183
#define XactCompletionRelcacheInitFileInval(xinfo)
Definition: xact.h:214
#define XACT_XINFO_HAS_SUBXACTS
Definition: xact.h:190
#define XACT_XINFO_HAS_DROPPED_STATS
Definition: xact.h:197
const char * xact_identify(uint8 info)
Definition: xactdesc.c:487
static void xact_desc_stats(StringInfo buf, const char *label, int ndropped, xl_xact_stats_item *dropped_stats)
Definition: xactdesc.c:312
static void xact_desc_commit(StringInfo buf, uint8 info, xl_xact_commit *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:334
static void xact_desc_relations(StringInfo buf, char *label, int nrels, RelFileLocator *xlocators)
Definition: xactdesc.c:282
static void xact_desc_abort(StringInfo buf, uint8 info, xl_xact_abort *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:370
static void xact_desc_subxacts(StringInfo buf, int nsubxacts, TransactionId *subxacts)
Definition: xactdesc.c:299
static void xact_desc_assignment(StringInfo buf, xl_xact_assignment *xlrec)
Definition: xactdesc.c:428
static void xact_desc_prepare(StringInfo buf, uint8 info, xl_xact_prepare *xlrec, RepOriginId origin_id)
Definition: xactdesc.c:397
void ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed)
Definition: xactdesc.c:35
void ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed)
Definition: xactdesc.c:141
void xact_desc(StringInfo buf, XLogReaderState *record)
Definition: xactdesc.c:439
void ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *parsed)
Definition: xactdesc.c:239
#define LSN_FORMAT_ARGS(lsn)
Definition: xlogdefs.h:46
uint16 RepOriginId
Definition: xlogdefs.h:68
#define XLogRecGetOrigin(decoder)
Definition: xlogreader.h:413
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415

AltStyle によって変換されたページ (->オリジナル) /