Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * standbydesc.c
4 : * rmgr descriptor routines for storage/ipc/standby.c
5 : *
6 : * Portions Copyright (c) 1996-2017, 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 0 : standby_desc_running_xacts(StringInfo buf, xl_running_xacts *xlrec)
21 : {
22 : int i;
23 :
24 0 : appendStringInfo(buf, "nextXid %u latestCompletedXid %u oldestRunningXid %u",
25 : xlrec->nextXid,
26 : xlrec->latestCompletedXid,
27 : xlrec->oldestRunningXid);
28 0 : 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 0 : if (xlrec->subxid_overflow)
36 0 : appendStringInfoString(buf, "; subxid ovf");
37 0 : }
38 :
39 : void
40 0 : standby_desc(StringInfo buf, XLogReaderState *record)
41 : {
42 0 : char *rec = XLogRecGetData(record);
43 0 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
44 :
45 0 : if (info == XLOG_STANDBY_LOCK)
46 : {
47 0 : xl_standby_locks *xlrec = (xl_standby_locks *) rec;
48 : int i;
49 :
50 0 : for (i = 0; i < xlrec->nlocks; i++)
51 0 : appendStringInfo(buf, "xid %u db %u rel %u ",
52 : xlrec->locks[i].xid, xlrec->locks[i].dbOid,
53 : xlrec->locks[i].relOid);
54 : }
55 0 : else if (info == XLOG_RUNNING_XACTS)
56 : {
57 0 : xl_running_xacts *xlrec = (xl_running_xacts *) rec;
58 :
59 0 : standby_desc_running_xacts(buf, xlrec);
60 : }
61 0 : else if (info == XLOG_INVALIDATIONS)
62 : {
63 0 : xl_invalidations *xlrec = (xl_invalidations *) rec;
64 :
65 0 : standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
66 : xlrec->dbId, xlrec->tsId,
67 0 : xlrec->relcacheInitFileInval);
68 : }
69 0 : }
70 :
71 : const char *
72 0 : standby_identify(uint8 info)
73 : {
74 0 : const char *id = NULL;
75 :
76 0 : switch (info & ~XLR_INFO_MASK)
77 : {
78 : case XLOG_STANDBY_LOCK:
79 0 : id = "LOCK";
80 0 : break;
81 : case XLOG_RUNNING_XACTS:
82 0 : id = "RUNNING_XACTS";
83 0 : break;
84 : case XLOG_INVALIDATIONS:
85 0 : id = "INVALIDATIONS";
86 0 : break;
87 : }
88 :
89 0 : return id;
90 : }
91 :
92 : /*
93 : * This routine is used by both standby_desc and xact_desc, because
94 : * transaction commits and XLOG_INVALIDATIONS messages contain invalidations;
95 : * it seems pointless to duplicate the code.
96 : */
97 : void
98 0 : standby_desc_invalidations(StringInfo buf,
99 : int nmsgs, SharedInvalidationMessage *msgs,
100 : Oid dbId, Oid tsId,
101 : bool relcacheInitFileInval)
102 : {
103 : int i;
104 :
105 0 : if (relcacheInitFileInval)
106 0 : appendStringInfo(buf, "; relcache init file inval dbid %u tsid %u",
107 : dbId, tsId);
108 :
109 0 : appendStringInfoString(buf, "; inval msgs:");
110 0 : for (i = 0; i < nmsgs; i++)
111 : {
112 0 : SharedInvalidationMessage *msg = &msgs[i];
113 :
114 0 : if (msg->id >= 0)
115 0 : appendStringInfo(buf, " catcache %d", msg->id);
116 0 : else if (msg->id == SHAREDINVALCATALOG_ID)
117 0 : appendStringInfo(buf, " catalog %u", msg->cat.catId);
118 0 : else if (msg->id == SHAREDINVALRELCACHE_ID)
119 0 : appendStringInfo(buf, " relcache %u", msg->rc.relId);
120 : /* not expected, but print something anyway */
121 0 : else if (msg->id == SHAREDINVALSMGR_ID)
122 0 : appendStringInfoString(buf, " smgr");
123 : /* not expected, but print something anyway */
124 0 : else if (msg->id == SHAREDINVALRELMAP_ID)
125 0 : appendStringInfo(buf, " relmap db %u", msg->rm.dbId);
126 0 : else if (msg->id == SHAREDINVALSNAPSHOT_ID)
127 0 : appendStringInfo(buf, " snapshot %u", msg->sn.relId);
128 : else
129 0 : appendStringInfo(buf, " unrecognized id %d", msg->id);
130 : }
131 0 : }
|