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 22 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
21 : {
22 : int i;
23 :
24 22 : appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
25 : xlrec->nextXid,
26 : xlrec->latestCompletedXid,
27 : xlrec->oldestRunningXid);
28 22 : if (xlrec->xcnt > 0)
29 : {
30 22 : appendStringInfo(buf, "; %d xacts:", xlrec->xcnt);
31 44 : for (i = 0; i < xlrec->xcnt; i++)
32 22 : appendStringInfo(buf, " %u", xlrec->xids[i]);
33 : }
34 :
35 22 : if (xlrec->subxid_overflow)
36 0 : appendStringInfoString(buf, "; subxid overflowed");
37 :
38 22 : 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 22 : }
45 :
46 : void
47 3055 : standby_desc(StringInfo buf, XLogReaderState *record)
48 : {
49 3055 : char *rec = XLogRecGetData(record);
50 3055 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
51 :
52 3055 : if (info == XLOG_STANDBY_LOCK)
53 : {
54 1023 : xl_standby_locks *xlrec = (xl_standby_locks *) rec;
55 : int i;
56 :
57 2046 : for (i = 0; i < xlrec->nlocks; i++)
58 1023 : appendStringInfo(buf, "xid %u db %u rel %u ",
59 : xlrec->locks[i].xid, xlrec->locks[i].dbOid,
60 : xlrec->locks[i].relOid);
61 : }
62 2032 : else if (info == XLOG_RUNNING_XACTS)
63 : {
64 22 : xl_running_xacts *xlrec = (xl_running_xacts *) rec;
65 :
66 22 : standby_desc_running_xacts(buf, xlrec);
67 : }
68 2010 : else if (info == XLOG_INVALIDATIONS)
69 : {
70 2010 : xl_invalidations *xlrec = (xl_invalidations *) rec;
71 :
72 2010 : standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
73 : xlrec->dbId, xlrec->tsId,
74 2010 : xlrec->relcacheInitFileInval);
75 : }
76 3055 : }
77 :
78 : const char *
79 3064 : standby_identify(uint8 info)
80 : {
81 3064 : const char *id = NULL;
82 :
83 3064 : switch (info & ~XLR_INFO_MASK)
84 : {
85 1026 : case XLOG_STANDBY_LOCK:
86 1026 : id = "LOCK";
87 1026 : break;
88 25 : case XLOG_RUNNING_XACTS:
89 25 : id = "RUNNING_XACTS";
90 25 : break;
91 2013 : case XLOG_INVALIDATIONS:
92 2013 : id = "INVALIDATIONS";
93 2013 : break;
94 : }
95 :
96 3064 : return id;
97 : }
98 :
99 : /* also used by non-standby records having analogous invalidation fields */
100 : void
101 9034 : standby_desc_invalidations(StringInfo buf,
102 : int nmsgs, SharedInvalidationMessage *msgs,
103 : Oid dbId, Oid tsId,
104 : bool relcacheInitFileInval)
105 : {
106 : int i;
107 :
108 : /* Do nothing if there are no invalidation messages */
109 9034 : if (nmsgs <= 0)
110 165 : return;
111 :
112 8869 : if (relcacheInitFileInval)
113 2211 : appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
114 : dbId, tsId);
115 :
116 8869 : appendStringInfoString(buf, "; inval msgs:");
117 66302 : for (i = 0; i < nmsgs; i++)
118 : {
119 57433 : SharedInvalidationMessage *msg = &msgs[i];
120 :
121 57433 : if (msg->id >= 0)
122 43168 : appendStringInfo(buf, " catcache %d", msg->id);
123 14265 : else if (msg->id == SHAREDINVALCATALOG_ID)
124 28 : appendStringInfo(buf, " catalog %u", msg->cat.catId);
125 14237 : else if (msg->id == SHAREDINVALRELCACHE_ID)
126 10629 : appendStringInfo(buf, " relcache %u", msg->rc.relId);
127 : /* not expected, but print something anyway */
128 3608 : else if (msg->id == SHAREDINVALSMGR_ID)
129 0 : appendStringInfoString(buf, " smgr");
130 : /* not expected, but print something anyway */
131 3608 : else if (msg->id == SHAREDINVALRELMAP_ID)
132 0 : appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
133 3608 : else if (msg->id == SHAREDINVALSNAPSHOT_ID)
134 3608 : appendStringInfo(buf, " snapshot %u", msg->sn.relId);
135 0 : else if (msg->id == SHAREDINVALRELSYNC_ID)
136 0 : appendStringInfo(buf, " relsync %u", msg->rs.relid);
137 : else
138 0 : appendStringInfo(buf, " unrecognized id %d", msg->id);
139 : }
140 : }
|