Skip to content

Commit 604f795

Browse files
committed
Improve code around the recently added rm_identify rmgr callback.
There are four weaknesses in728f152e07f998d2cb4fe5f24ec8da2c3bda98f2: * append_init() in heapdesc.c was ugly and required that rm_identify return values are only valid till the next call. Instead just add a couple more switch() cases for the INIT_PAGE cases. Now the returned value will always be valid. * a couple rm_identify() callbacks missed masking xl_info with ~XLR_INFO_MASK. * pg_xlogdump didn't map a NULL rm_identify to UNKNOWN or a similar string. * append_init() was called when id=NULL - which should never actually happen. But it's better to be careful.
1 parent 898f8a9 commit 604f795

18 files changed

+36
-38
lines changed

contrib/pg_xlogdump/pg_xlogdump.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,13 @@ XLogDumpCountRecord(XLogDumpConfig *config, XLogDumpStats *stats, XLogRecPtr Rea
382382
static void
383383
XLogDumpDisplayRecord(XLogDumpConfig *config, XLogRecPtr ReadRecPtr, XLogRecord *record)
384384
{
385+
const char *id;
385386
const RmgrDescData *desc = &RmgrDescTable[record->xl_rmid];
386387

388+
id = desc->rm_identify(record->xl_info);
389+
if (id == NULL)
390+
id = psprintf("UNKNOWN (%x)", record->xl_info & ~XLR_INFO_MASK);
391+
387392
printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, bkp: %u%u%u%u, desc: %s ",
388393
desc->rm_name,
389394
record->xl_len, record->xl_tot_len,
@@ -394,7 +399,7 @@ XLogDumpDisplayRecord(XLogDumpConfig *config, XLogRecPtr ReadRecPtr, XLogRecord
394399
!!(XLR_BKP_BLOCK(1) & record->xl_info),
395400
!!(XLR_BKP_BLOCK(2) & record->xl_info),
396401
!!(XLR_BKP_BLOCK(3) & record->xl_info),
397-
desc->rm_identify(record->xl_info));
402+
id);
398403

399404
/* the desc routine will printf the description directly to stdout */
400405
desc->rm_desc(NULL, record);

src/backend/access/rmgrdesc/clogdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ clog_identify(uint8 info)
3737
{
3838
const char *id = NULL;
3939

40-
switch (info)
40+
switch (info & ~XLR_INFO_MASK)
4141
{
4242
case CLOG_ZEROPAGE:
4343
id = "ZEROPAGE";

src/backend/access/rmgrdesc/dbasedesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ dbase_identify(uint8 info)
4646
{
4747
const char *id = NULL;
4848

49-
switch (info)
49+
switch (info & ~XLR_INFO_MASK)
5050
{
5151
case XLOG_DBASE_CREATE:
5252
id = "CREATE";

src/backend/access/rmgrdesc/gindesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ gin_identify(uint8 info)
181181
{
182182
const char *id = NULL;
183183

184-
switch (info)
184+
switch (info & ~XLR_INFO_MASK)
185185
{
186186
case XLOG_GIN_CREATE_INDEX:
187187
id = "CREATE_INDEX";

src/backend/access/rmgrdesc/gistdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ gist_identify(uint8 info)
6969
{
7070
const char *id = NULL;
7171

72-
switch (info)
72+
switch (info & ~XLR_INFO_MASK)
7373
{
7474
case XLOG_GIST_PAGE_UPDATE:
7575
id = "PAGE_UPDATE";

src/backend/access/rmgrdesc/heapdesc.c

+14-19
Original file line numberDiff line numberDiff line change
@@ -166,36 +166,34 @@ heap2_desc(StringInfo buf, XLogRecord *record)
166166
}
167167
}
168168

169-
static const char *
170-
append_init(const char *str)
171-
{
172-
static char x[32];
173-
174-
strcpy(x, str);
175-
strcat(x, "+INIT");
176-
177-
return x;
178-
}
179-
180169
const char *
181170
heap_identify(uint8 info)
182171
{
183172
const char *id = NULL;
184173

185-
switch (info & XLOG_HEAP_OPMASK)
174+
switch (info & ~XLR_INFO_MASK)
186175
{
187176
case XLOG_HEAP_INSERT:
188177
id = "INSERT";
189178
break;
179+
case XLOG_HEAP_INSERT | XLOG_HEAP_INIT_PAGE:
180+
id = "INSERT+INIT";
181+
break;
190182
case XLOG_HEAP_DELETE:
191183
id = "DELETE";
192184
break;
193185
case XLOG_HEAP_UPDATE:
194186
id = "UPDATE";
195187
break;
188+
case XLOG_HEAP_UPDATE | XLOG_HEAP_INIT_PAGE:
189+
id = "UPDATE+INIT";
190+
break;
196191
case XLOG_HEAP_HOT_UPDATE:
197192
id = "HOT_UPDATE";
198193
break;
194+
case XLOG_HEAP_HOT_UPDATE | XLOG_HEAP_INIT_PAGE:
195+
id = "HOT_UPDATE+INIT";
196+
break;
199197
case XLOG_HEAP_LOCK:
200198
id = "LOCK";
201199
break;
@@ -204,9 +202,6 @@ heap_identify(uint8 info)
204202
break;
205203
}
206204

207-
if (info & XLOG_HEAP_INIT_PAGE)
208-
id = append_init(id);
209-
210205
return id;
211206
}
212207

@@ -215,7 +210,7 @@ heap2_identify(uint8 info)
215210
{
216211
const char *id = NULL;
217212

218-
switch (info & XLOG_HEAP_OPMASK)
213+
switch (info & ~XLR_INFO_MASK)
219214
{
220215
case XLOG_HEAP2_CLEAN:
221216
id = "CLEAN";
@@ -232,6 +227,9 @@ heap2_identify(uint8 info)
232227
case XLOG_HEAP2_MULTI_INSERT:
233228
id = "MULTI_INSERT";
234229
break;
230+
case XLOG_HEAP2_MULTI_INSERT | XLOG_HEAP_INIT_PAGE:
231+
id = "MULTI_INSERT+INIT";
232+
break;
235233
case XLOG_HEAP2_LOCK_UPDATED:
236234
id = "LOCK_UPDATED";
237235
break;
@@ -243,8 +241,5 @@ heap2_identify(uint8 info)
243241
break;
244242
}
245243

246-
if (info & XLOG_HEAP_INIT_PAGE)
247-
id = append_init(id);
248-
249244
return id;
250245
}

src/backend/access/rmgrdesc/mxactdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ multixact_identify(uint8 info)
7777
{
7878
const char *id = NULL;
7979

80-
switch (info)
80+
switch (info & ~XLR_INFO_MASK)
8181
{
8282
case XLOG_MULTIXACT_ZERO_OFF_PAGE:
8383
id = "ZERO_OFF_PAGE";

src/backend/access/rmgrdesc/nbtdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ btree_identify(uint8 info)
126126
{
127127
const char *id = NULL;
128128

129-
switch (info)
129+
switch (info & ~XLR_INFO_MASK)
130130
{
131131
case XLOG_BTREE_INSERT_LEAF:
132132
id = "INSERT_LEAF";

src/backend/access/rmgrdesc/relmapdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ relmap_identify(uint8 info)
3636
{
3737
const char *id = NULL;
3838

39-
switch (info)
39+
switch (info & ~XLR_INFO_MASK)
4040
{
4141
case XLOG_RELMAP_UPDATE:
4242
id = "UPDATE";

src/backend/access/rmgrdesc/seqdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ seq_identify(uint8 info)
3535
{
3636
const char *id = NULL;
3737

38-
switch (info)
38+
switch (info & ~XLR_INFO_MASK)
3939
{
4040
case XLOG_SEQ_LOG:
4141
id = "LOG";

src/backend/access/rmgrdesc/smgrdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ smgr_identify(uint8 info)
4747
{
4848
const char *id = NULL;
4949

50-
switch (info)
50+
switch (info & ~XLR_INFO_MASK)
5151
{
5252
case XLOG_SMGR_CREATE:
5353
id = "CREATE";

src/backend/access/rmgrdesc/spgdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ spg_identify(uint8 info)
9090
{
9191
const char *id = NULL;
9292

93-
switch (info)
93+
switch (info & ~XLR_INFO_MASK)
9494
{
9595
case XLOG_SPGIST_CREATE_INDEX:
9696
id = "CREATE_INDEX";

src/backend/access/rmgrdesc/standbydesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ standby_identify(uint8 info)
6565
{
6666
const char *id = NULL;
6767

68-
switch (info)
68+
switch (info & ~XLR_INFO_MASK)
6969
{
7070
case XLOG_STANDBY_LOCK:
7171
id = "LOCK";

src/backend/access/rmgrdesc/tblspcdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ tblspc_identify(uint8 info)
4242
{
4343
const char *id = NULL;
4444

45-
switch (info)
45+
switch (info & ~XLR_INFO_MASK)
4646
{
4747
case XLOG_TBLSPC_CREATE:
4848
id = "CREATE";

src/backend/access/rmgrdesc/xactdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ xact_identify(uint8 info)
193193
{
194194
const char *id = NULL;
195195

196-
switch (info)
196+
switch (info & ~XLR_INFO_MASK)
197197
{
198198
case XLOG_XACT_COMMIT:
199199
id = "COMMIT";

src/backend/access/rmgrdesc/xlogdesc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ xlog_identify(uint8 info)
139139
{
140140
const char *id = NULL;
141141

142-
switch (info)
142+
switch (info & ~XLR_INFO_MASK)
143143
{
144144
case XLOG_CHECKPOINT_SHUTDOWN:
145145
id = "CHECKPOINT_SHUTDOWN";

src/backend/access/transam/xlog.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -9642,7 +9642,8 @@ xlog_outdesc(StringInfo buf, RmgrId rmid, XLogRecord *record)
96429642

96439643
id = RmgrTable[rmid].rm_identify(record->xl_info);
96449644
if (id == NULL)
9645-
appendStringInfo(buf, "UNKNOWN (%X): ", record->xl_info);
9645+
appendStringInfo(buf, "UNKNOWN (%X): ",
9646+
record->xl_info & ~XLR_INFO_MASK);
96469647
else
96479648
appendStringInfo(buf, "%s: ", id);
96489649

src/include/access/xlog_internal.h

-3
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,6 @@ struct XLogRecord;
244244
* "VACUUM". rm_desc can then be called to obtain additional detail for the
245245
* record, if available (e.g. the last block).
246246
*
247-
* The return value from rm_identify is a pointer to a statically allocated
248-
* buffer, and only valid until the next invocation of the callback.
249-
*
250247
* RmgrTable[] is indexed by RmgrId values (see rmgrlist.h).
251248
*/
252249
typedef struct RmgrData

0 commit comments

Comments
 (0)