Age Owner Branch data TLA 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
4906 alvherre@alvh.no-ip. 20 :CBC 31 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
21 : : {
22 : : int i;
23 : :
4246 andres@anarazel.de 24 : 31 : appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
25 : : xlrec->nextXid,
26 : : xlrec->latestCompletedXid,
27 : : xlrec->oldestRunningXid);
4906 alvherre@alvh.no-ip. 28 [ + + ]: 31 : 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 [ - + ]: 31 : if (xlrec->subxid_overflow)
1280 akapila@postgresql.o 36 :UBC 0 : appendStringInfoString(buf, "; subxid overflowed");
37 : :
1280 akapila@postgresql.o 38 [ - + ]:CBC 31 : if (xlrec->subxcnt > 0)
39 : : {
1280 akapila@postgresql.o 40 :UBC 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 : :
28 alvherre@kurilemu.de 45 :GNC 31 : appendStringInfo(buf, "; dbid: %u", xlrec->dbid);
4906 alvherre@alvh.no-ip. 46 :CBC 31 : }
47 : :
48 : : void
4184 heikki.linnakangas@i 49 : 3075 : standby_desc(StringInfo buf, XLogReaderState *record)
50 : : {
4343 51 : 3075 : char *rec = XLogRecGetData(record);
4184 52 : 3075 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
53 : :
4906 alvherre@alvh.no-ip. 54 [ + + ]: 3075 : if (info == XLOG_STANDBY_LOCK)
55 : : {
56 : 1033 : xl_standby_locks *xlrec = (xl_standby_locks *) rec;
57 : : int i;
58 : :
59 [ + + ]: 2066 : for (i = 0; i < xlrec->nlocks; i++)
4246 andres@anarazel.de 60 : 1033 : appendStringInfo(buf, "xid %u db %u rel %u ",
61 : : xlrec->locks[i].xid, xlrec->locks[i].dbOid,
62 : : xlrec->locks[i].relOid);
63 : : }
4906 alvherre@alvh.no-ip. 64 [ + + ]: 2042 : else if (info == XLOG_RUNNING_XACTS)
65 : : {
66 : 31 : xl_running_xacts *xlrec = (xl_running_xacts *) rec;
67 : :
68 : 31 : standby_desc_running_xacts(buf, xlrec);
69 : : }
3664 andres@anarazel.de 70 [ + - ]: 2011 : else if (info == XLOG_INVALIDATIONS)
71 : : {
72 : 2011 : xl_invalidations *xlrec = (xl_invalidations *) rec;
73 : :
74 : 2011 : standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
75 : : xlrec->dbId, xlrec->tsId,
76 : 2011 : xlrec->relcacheInitFileInval);
77 : : }
4246 78 : 3075 : }
79 : :
80 : : const char *
81 : 3084 : standby_identify(uint8 info)
82 : : {
83 : 3084 : const char *id = NULL;
84 : :
4243 85 [ + + + - ]: 3084 : switch (info & ~XLR_INFO_MASK)
86 : : {
4246 87 : 1036 : case XLOG_STANDBY_LOCK:
88 : 1036 : id = "LOCK";
89 : 1036 : break;
90 : 34 : case XLOG_RUNNING_XACTS:
91 : 34 : id = "RUNNING_XACTS";
92 : 34 : break;
3664 93 : 2014 : case XLOG_INVALIDATIONS:
94 : 2014 : id = "INVALIDATIONS";
95 : 2014 : break;
96 : : }
97 : :
4246 98 : 3084 : return id;
99 : : }
100 : :
101 : : /* also used by non-standby records having analogous invalidation fields */
102 : : void
3664 103 : 9035 : 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 */
2365 fujii@postgresql.org 111 [ + + ]: 9035 : if (nmsgs <= 0)
112 : 172 : return;
113 : :
3664 andres@anarazel.de 114 [ + + ]: 8863 : if (relcacheInitFileInval)
115 : 2184 : appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
116 : : dbId, tsId);
117 : :
118 : 8863 : appendStringInfoString(buf, "; inval msgs:");
119 [ + + ]: 69067 : for (i = 0; i < nmsgs; i++)
120 : : {
121 : 60204 : SharedInvalidationMessage *msg = &msgs[i];
122 : :
123 [ + + ]: 60204 : if (msg->id >= 0)
124 : 45968 : appendStringInfo(buf, " catcache %d", msg->id);
125 [ + + ]: 14236 : else if (msg->id == SHAREDINVALCATALOG_ID)
126 : 28 : appendStringInfo(buf, " catalog %u", msg->cat.catId);
127 [ + + ]: 14208 : else if (msg->id == SHAREDINVALRELCACHE_ID)
128 : 10599 : appendStringInfo(buf, " relcache %u", msg->rc.relId);
129 : : /* not expected, but print something anyway */
130 [ - + ]: 3609 : else if (msg->id == SHAREDINVALSMGR_ID)
3664 andres@anarazel.de 131 :UBC 0 : appendStringInfoString(buf, " smgr");
132 : : /* not expected, but print something anyway */
3664 andres@anarazel.de 133 [ - + ]:CBC 3609 : else if (msg->id == SHAREDINVALRELMAP_ID)
3664 andres@anarazel.de 134 :UBC 0 : appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
3664 andres@anarazel.de 135 [ + - ]:CBC 3609 : else if (msg->id == SHAREDINVALSNAPSHOT_ID)
136 : 3609 : appendStringInfo(buf, " snapshot %u", msg->sn.relId);
418 akapila@postgresql.o 137 [ # # ]:UBC 0 : else if (msg->id == SHAREDINVALRELSYNC_ID)
138 : 0 : appendStringInfo(buf, " relsync %u", msg->rs.relid);
139 : : else
3511 tgl@sss.pgh.pa.us 140 : 0 : appendStringInfo(buf, " unrecognized id %d", msg->id);
141 : : }
142 : : }
|