Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * standbydesc.c
4 : * rmgr descriptor routines for storage/ipc/standby.c
5 : *
6 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : *
10 : * IDENTIFICATION
11 : * src/backend/access/rmgrdesc/standbydesc.c
12 : *
13 : *-------------------------------------------------------------------------
14 : */
15 : #include "postgres.h"
16 :
17 : #include "storage/standbydefs.h"
18 :
19 : static void
20 9 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
21 : {
22 : int i;
23 :
24 9 : appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
25 : xlrec->nextXid,
26 : xlrec->latestCompletedXid,
27 : xlrec->oldestRunningXid);
28 9 : if (xlrec->xcnt > 0)
29 : {
30 0 : appendStringInfo(buf, "; %d xacts:", xlrec->xcnt);
31 0 : for (i = 0; i < xlrec->xcnt; i++)
32 0 : appendStringInfo(buf, " %u", xlrec->xids[i]);
33 : }
34 :
35 9 : if (xlrec->subxid_overflow)
36 0 : appendStringInfoString(buf, "; subxid overflowed");
37 :
38 9 : if (xlrec->subxcnt > 0)
39 : {
40 0 : appendStringInfo(buf, "; %d subxacts:", xlrec->subxcnt);
41 0 : for (i = 0; i < xlrec->subxcnt; i++)
42 0 : appendStringInfo(buf, " %u", xlrec->xids[xlrec->xcnt + i]);
43 : }
44 :
45 9 : appendStringInfo(buf, "; dbid: %u", xlrec->dbid);
46 9 : }
47 :
48 : void
49 14 : standby_desc(StringInfo buf, XLogReaderState *record)
50 : {
51 14 : char *rec = XLogRecGetData(record);
52 14 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
53 :
54 14 : if (info == XLOG_STANDBY_LOCK)
55 : {
56 4 : xl_standby_locks *xlrec = (xl_standby_locks *) rec;
57 : int i;
58 :
59 8 : for (i = 0; i < xlrec->nlocks; i++)
60 4 : appendStringInfo(buf, "xid %u db %u rel %u ",
61 : xlrec->locks[i].xid, xlrec->locks[i].dbOid,
62 : xlrec->locks[i].relOid);
63 : }
64 10 : else if (info == XLOG_RUNNING_XACTS)
65 : {
66 9 : xl_running_xacts *xlrec = (xl_running_xacts *) rec;
67 :
68 9 : standby_desc_running_xacts(buf, xlrec);
69 : }
70 1 : else if (info == XLOG_INVALIDATIONS)
71 : {
72 1 : xl_invalidations *xlrec = (xl_invalidations *) rec;
73 :
74 1 : standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
75 : xlrec->dbId, xlrec->tsId,
76 1 : xlrec->relcacheInitFileInval);
77 : }
78 14 : }
79 :
80 : const char *
81 14 : standby_identify(uint8 info)
82 : {
83 14 : const char *id = NULL;
84 :
85 14 : switch (info & ~XLR_INFO_MASK)
86 : {
87 4 : case XLOG_STANDBY_LOCK:
88 4 : id = "LOCK";
89 4 : break;
90 9 : case XLOG_RUNNING_XACTS:
91 9 : id = "RUNNING_XACTS";
92 9 : break;
93 1 : case XLOG_INVALIDATIONS:
94 1 : id = "INVALIDATIONS";
95 1 : break;
96 : }
97 :
98 14 : return id;
99 : }
100 :
101 : /* also used by non-standby records having analogous invalidation fields */
102 : void
103 27 : standby_desc_invalidations(StringInfo buf,
104 : int nmsgs, SharedInvalidationMessage *msgs,
105 : Oid dbId, Oid tsId,
106 : bool relcacheInitFileInval)
107 : {
108 : int i;
109 :
110 : /* Do nothing if there are no invalidation messages */
111 27 : if (nmsgs <= 0)
112 7 : return;
113 :
114 20 : if (relcacheInitFileInval)
115 1 : appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
116 : dbId, tsId);
117 :
118 20 : appendStringInfoString(buf, "; inval msgs:");
119 319 : for (i = 0; i < nmsgs; i++)
120 : {
121 299 : SharedInvalidationMessage *msg = &msgs[i];
122 :
123 299 : if (msg->id >= 0)
124 238 : appendStringInfo(buf, " catcache %d", msg->id);
125 61 : else if (msg->id == SHAREDINVALCATALOG_ID)
126 0 : appendStringInfo(buf, " catalog %u", msg->cat.catId);
127 61 : else if (msg->id == SHAREDINVALRELCACHE_ID)
128 36 : appendStringInfo(buf, " relcache %u", msg->rc.relId);
129 : /* not expected, but print something anyway */
130 25 : else if (msg->id == SHAREDINVALSMGR_ID)
131 0 : appendStringInfoString(buf, " smgr");
132 : /* not expected, but print something anyway */
133 25 : else if (msg->id == SHAREDINVALRELMAP_ID)
134 0 : appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
135 25 : else if (msg->id == SHAREDINVALSNAPSHOT_ID)
136 25 : appendStringInfo(buf, " snapshot %u", msg->sn.relId);
137 0 : else if (msg->id == SHAREDINVALRELSYNC_ID)
138 0 : appendStringInfo(buf, " relsync %u", msg->rs.relid);
139 : else
140 0 : appendStringInfo(buf, " unrecognized id %d", msg->id);
141 : }
142 : }
|