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-2024, 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
4155 alvherre@alvh.no-ip. 20 :CBC 18 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
21 : : {
22 : : int i;
23 : :
3495 andres@anarazel.de 24 : 18 : appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
25 : : xlrec->nextXid,
26 : : xlrec->latestCompletedXid,
27 : : xlrec->oldestRunningXid);
4155 alvherre@alvh.no-ip. 28 [ + + ]: 18 : if (xlrec->xcnt > 0)
29 : : {
4155 alvherre@alvh.no-ip. 30 :GBC 14 : appendStringInfo(buf, "; %d xacts:", xlrec->xcnt);
31 [ + + ]: 28 : for (i = 0; i < xlrec->xcnt; i++)
32 : 14 : appendStringInfo(buf, " %u", xlrec->xids[i]);
33 : : }
34 : :
4155 alvherre@alvh.no-ip. 35 [ - + ]:CBC 18 : if (xlrec->subxid_overflow)
529 akapila@postgresql.o 36 :UBC 0 : appendStringInfoString(buf, "; subxid overflowed");
37 : :
529 akapila@postgresql.o 38 [ - + ]:CBC 18 : if (xlrec->subxcnt > 0)
39 : : {
529 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 : : }
4155 alvherre@alvh.no-ip. 44 :CBC 18 : }
45 : :
46 : : void
3433 heikki.linnakangas@i 47 : 1717 : standby_desc(StringInfo buf, XLogReaderState *record)
48 : : {
3592 49 : 1717 : char *rec = XLogRecGetData(record);
3433 50 : 1717 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
51 : :
4155 alvherre@alvh.no-ip. 52 [ + + ]: 1717 : if (info == XLOG_STANDBY_LOCK)
53 : : {
54 : 722 : xl_standby_locks *xlrec = (xl_standby_locks *) rec;
55 : : int i;
56 : :
57 [ + + ]: 1444 : for (i = 0; i < xlrec->nlocks; i++)
3495 andres@anarazel.de 58 : 722 : appendStringInfo(buf, "xid %u db %u rel %u ",
59 : : xlrec->locks[i].xid, xlrec->locks[i].dbOid,
60 : : xlrec->locks[i].relOid);
61 : : }
4155 alvherre@alvh.no-ip. 62 [ + + ]: 995 : else if (info == XLOG_RUNNING_XACTS)
63 : : {
64 : 18 : xl_running_xacts *xlrec = (xl_running_xacts *) rec;
65 : :
66 : 18 : standby_desc_running_xacts(buf, xlrec);
67 : : }
2913 andres@anarazel.de 68 [ + - ]: 977 : else if (info == XLOG_INVALIDATIONS)
69 : : {
70 : 977 : xl_invalidations *xlrec = (xl_invalidations *) rec;
71 : :
72 : 977 : standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
73 : : xlrec->dbId, xlrec->tsId,
74 : 977 : xlrec->relcacheInitFileInval);
75 : : }
3495 76 : 1717 : }
77 : :
78 : : const char *
79 : 1720 : standby_identify(uint8 info)
80 : : {
81 : 1720 : const char *id = NULL;
82 : :
3492 83 [ + + + - ]: 1720 : switch (info & ~XLR_INFO_MASK)
84 : : {
3495 85 : 723 : case XLOG_STANDBY_LOCK:
86 : 723 : id = "LOCK";
87 : 723 : break;
88 : 19 : case XLOG_RUNNING_XACTS:
89 : 19 : id = "RUNNING_XACTS";
90 : 19 : break;
2913 91 : 978 : case XLOG_INVALIDATIONS:
92 : 978 : id = "INVALIDATIONS";
93 : 978 : break;
94 : : }
95 : :
3495 96 : 1720 : return id;
97 : : }
98 : :
99 : : /*
100 : : * This routine is used by both standby_desc and xact_desc, because
101 : : * transaction commits and XLOG_INVALIDATIONS messages contain invalidations;
102 : : * it seems pointless to duplicate the code.
103 : : */
104 : : void
2913 105 : 3755 : standby_desc_invalidations(StringInfo buf,
106 : : int nmsgs, SharedInvalidationMessage *msgs,
107 : : Oid dbId, Oid tsId,
108 : : bool relcacheInitFileInval)
109 : : {
110 : : int i;
111 : :
112 : : /* Do nothing if there are no invalidation messages */
1614 fujii@postgresql.org 113 [ + + ]: 3755 : if (nmsgs <= 0)
114 : 75 : return;
115 : :
2913 andres@anarazel.de 116 [ + + ]: 3680 : if (relcacheInitFileInval)
117 : 591 : appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
118 : : dbId, tsId);
119 : :
120 : 3680 : appendStringInfoString(buf, "; inval msgs:");
121 [ + + ]: 39911 : for (i = 0; i < nmsgs; i++)
122 : : {
123 : 36231 : SharedInvalidationMessage *msg = &msgs[i];
124 : :
125 [ + + ]: 36231 : if (msg->id >= 0)
126 : 28870 : appendStringInfo(buf, " catcache %d", msg->id);
127 [ + + ]: 7361 : else if (msg->id == SHAREDINVALCATALOG_ID)
2913 andres@anarazel.de 128 :GBC 12 : appendStringInfo(buf, " catalog %u", msg->cat.catId);
2913 andres@anarazel.de 129 [ + + ]:CBC 7349 : else if (msg->id == SHAREDINVALRELCACHE_ID)
130 : 4352 : appendStringInfo(buf, " relcache %u", msg->rc.relId);
131 : : /* not expected, but print something anyway */
132 [ - + ]: 2997 : else if (msg->id == SHAREDINVALSMGR_ID)
2913 andres@anarazel.de 133 :UBC 0 : appendStringInfoString(buf, " smgr");
134 : : /* not expected, but print something anyway */
2913 andres@anarazel.de 135 [ - + ]:CBC 2997 : else if (msg->id == SHAREDINVALRELMAP_ID)
2913 andres@anarazel.de 136 :UBC 0 : appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
2913 andres@anarazel.de 137 [ + - ]:CBC 2997 : else if (msg->id == SHAREDINVALSNAPSHOT_ID)
138 : 2997 : appendStringInfo(buf, " snapshot %u", msg->sn.relId);
139 : : else
2760 tgl@sss.pgh.pa.us 140 :UBC 0 : appendStringInfo(buf, " unrecognized id %d", msg->id);
141 : : }
142 : : }
|