Skip to content

Commit 1c453cf

Browse files
Show more detail in nbtree rmgr descriptions.
Show a detailed description of the page offset number arrays that appear in certain nbtree WAL records. Also brings nbtree desc routines in line with the guidelines established by recent commit 7d8219a. Author: Melanie Plageman <melanieplageman@gmail.com> Reviewed-By: Peter Geoghegan <pg@bowt.ie> Discussion: https://postgr.es/m/flat/20230109215842.fktuhesvayno6o4g%40awork3.anarazel.de
1 parent ce5e234 commit 1c453cf

File tree

3 files changed

+83
-11
lines changed

3 files changed

+83
-11
lines changed

src/backend/access/rmgrdesc/nbtdesc.c

+76-11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,61 @@
1515
#include "postgres.h"
1616

1717
#include "access/nbtxlog.h"
18+
#include "access/rmgrdesc_utils.h"
19+
20+
static void btree_del_desc(StringInfo buf, char *block_data, uint16 ndeleted,
21+
uint16 nupdated);
22+
static void btree_update_elem_desc(StringInfo buf, void *update, void *data);
23+
24+
static void
25+
btree_del_desc(StringInfo buf, char *block_data, uint16 ndeleted,
26+
uint16 nupdated)
27+
{
28+
OffsetNumber *updatedoffsets;
29+
xl_btree_update *updates;
30+
OffsetNumber *data = (OffsetNumber *) block_data;
31+
32+
appendStringInfoString(buf, ", deleted:");
33+
array_desc(buf, data, sizeof(OffsetNumber), ndeleted,
34+
&offset_elem_desc, NULL);
35+
36+
appendStringInfoString(buf, ", updated:");
37+
array_desc(buf, data, sizeof(OffsetNumber), nupdated,
38+
&offset_elem_desc, NULL);
39+
40+
if (nupdated <= 0)
41+
return;
42+
43+
updatedoffsets = (OffsetNumber *)
44+
((char *) data + ndeleted * sizeof(OffsetNumber));
45+
updates = (xl_btree_update *) ((char *) updatedoffsets +
46+
nupdated *
47+
sizeof(OffsetNumber));
48+
49+
appendStringInfoString(buf, ", updates:");
50+
array_desc(buf, updates, sizeof(xl_btree_update),
51+
nupdated, &btree_update_elem_desc,
52+
&updatedoffsets);
53+
}
54+
55+
static void
56+
btree_update_elem_desc(StringInfo buf, void *update, void *data)
57+
{
58+
xl_btree_update *new_update = (xl_btree_update *) update;
59+
OffsetNumber *updated_offset = *((OffsetNumber **) data);
60+
61+
appendStringInfo(buf, "{ updated offset: %u, ndeleted tids: %u",
62+
*updated_offset, new_update->ndeletedtids);
63+
64+
appendStringInfoString(buf, ", deleted tids:");
65+
66+
array_desc(buf, (char *) new_update + SizeOfBtreeUpdate, sizeof(uint16),
67+
new_update->ndeletedtids, &uint16_elem_desc, NULL);
68+
69+
updated_offset++;
70+
71+
appendStringInfo(buf, " }");
72+
}
1873

1974
void
2075
btree_desc(StringInfo buf, XLogReaderState *record)
@@ -31,15 +86,15 @@ btree_desc(StringInfo buf, XLogReaderState *record)
3186
{
3287
xl_btree_insert *xlrec = (xl_btree_insert *) rec;
3388

34-
appendStringInfo(buf, "off %u", xlrec->offnum);
89+
appendStringInfo(buf, "off: %u", xlrec->offnum);
3590
break;
3691
}
3792
case XLOG_BTREE_SPLIT_L:
3893
case XLOG_BTREE_SPLIT_R:
3994
{
4095
xl_btree_split *xlrec = (xl_btree_split *) rec;
4196

42-
appendStringInfo(buf, "level %u, firstrightoff %d, newitemoff %d, postingoff %d",
97+
appendStringInfo(buf, "level: %u, firstrightoff: %d, newitemoff: %d, postingoff: %d",
4398
xlrec->level, xlrec->firstrightoff,
4499
xlrec->newitemoff, xlrec->postingoff);
45100
break;
@@ -48,31 +103,41 @@ btree_desc(StringInfo buf, XLogReaderState *record)
48103
{
49104
xl_btree_dedup *xlrec = (xl_btree_dedup *) rec;
50105

51-
appendStringInfo(buf, "nintervals %u", xlrec->nintervals);
106+
appendStringInfo(buf, "nintervals: %u", xlrec->nintervals);
52107
break;
53108
}
54109
case XLOG_BTREE_VACUUM:
55110
{
56111
xl_btree_vacuum *xlrec = (xl_btree_vacuum *) rec;
57112

58-
appendStringInfo(buf, "ndeleted %u; nupdated %u",
113+
appendStringInfo(buf, "ndeleted: %u, nupdated: %u",
59114
xlrec->ndeleted, xlrec->nupdated);
115+
116+
if (!XLogRecHasBlockImage(record, 0))
117+
btree_del_desc(buf, XLogRecGetBlockData(record, 0, NULL),
118+
xlrec->ndeleted, xlrec->nupdated);
119+
60120
break;
61121
}
62122
case XLOG_BTREE_DELETE:
63123
{
64124
xl_btree_delete *xlrec = (xl_btree_delete *) rec;
65125

66-
appendStringInfo(buf, "snapshotConflictHorizon %u; ndeleted %u; nupdated %u",
126+
appendStringInfo(buf, "snapshotConflictHorizon: %u, ndeleted: %u, nupdated: %u",
67127
xlrec->snapshotConflictHorizon,
68128
xlrec->ndeleted, xlrec->nupdated);
129+
130+
if (!XLogRecHasBlockImage(record, 0))
131+
btree_del_desc(buf, XLogRecGetBlockData(record, 0, NULL),
132+
xlrec->ndeleted, xlrec->nupdated);
133+
69134
break;
70135
}
71136
case XLOG_BTREE_MARK_PAGE_HALFDEAD:
72137
{
73138
xl_btree_mark_page_halfdead *xlrec = (xl_btree_mark_page_halfdead *) rec;
74139

75-
appendStringInfo(buf, "topparent %u; leaf %u; left %u; right %u",
140+
appendStringInfo(buf, "topparent: %u; leaf: %u; left: %u; right: %u",
76141
xlrec->topparent, xlrec->leafblk, xlrec->leftblk, xlrec->rightblk);
77142
break;
78143
}
@@ -81,11 +146,11 @@ btree_desc(StringInfo buf, XLogReaderState *record)
81146
{
82147
xl_btree_unlink_page *xlrec = (xl_btree_unlink_page *) rec;
83148

84-
appendStringInfo(buf, "left %u; right %u; level %u; safexid %u:%u; ",
149+
appendStringInfo(buf, "left: %u; right: %u; level: %u; safexid: %u:%u; ",
85150
xlrec->leftsib, xlrec->rightsib, xlrec->level,
86151
EpochFromFullTransactionId(xlrec->safexid),
87152
XidFromFullTransactionId(xlrec->safexid));
88-
appendStringInfo(buf, "leafleft %u; leafright %u; leaftopparent %u",
153+
appendStringInfo(buf, "leafleft: %u; leafright: %u; leaftopparent: %u",
89154
xlrec->leafleftsib, xlrec->leafrightsib,
90155
xlrec->leaftopparent);
91156
break;
@@ -94,14 +159,14 @@ btree_desc(StringInfo buf, XLogReaderState *record)
94159
{
95160
xl_btree_newroot *xlrec = (xl_btree_newroot *) rec;
96161

97-
appendStringInfo(buf, "lev %u", xlrec->level);
162+
appendStringInfo(buf, "lev: %u", xlrec->level);
98163
break;
99164
}
100165
case XLOG_BTREE_REUSE_PAGE:
101166
{
102167
xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec;
103168

104-
appendStringInfo(buf, "rel %u/%u/%u; snapshotConflictHorizon %u:%u",
169+
appendStringInfo(buf, "rel: %u/%u/%u, snapshotConflictHorizon: %u:%u",
105170
xlrec->locator.spcOid, xlrec->locator.dbOid,
106171
xlrec->locator.relNumber,
107172
EpochFromFullTransactionId(xlrec->snapshotConflictHorizon),
@@ -114,7 +179,7 @@ btree_desc(StringInfo buf, XLogReaderState *record)
114179

115180
xlrec = (xl_btree_metadata *) XLogRecGetBlockData(record, 0,
116181
NULL);
117-
appendStringInfo(buf, "last_cleanup_num_delpages %u",
182+
appendStringInfo(buf, "last_cleanup_num_delpages: %u",
118183
xlrec->last_cleanup_num_delpages);
119184
break;
120185
}

src/backend/access/rmgrdesc/rmgrdesc_utils.c

+6
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,9 @@ relid_desc(StringInfo buf, void *relid, void *data)
8282
{
8383
appendStringInfo(buf, "%u", *(Oid *) relid);
8484
}
85+
86+
void
87+
uint16_elem_desc(StringInfo buf, void *value, void *data)
88+
{
89+
appendStringInfo(buf, "%u", *(uint16 *) value);
90+
}

src/include/access/rmgrdesc_utils.h

+1
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ extern void array_desc(StringInfo buf, void *array, size_t elem_size, int count,
1818
extern void offset_elem_desc(StringInfo buf, void *offset, void *data);
1919
extern void redirect_elem_desc(StringInfo buf, void *offset, void *data);
2020
extern void relid_desc(StringInfo buf, void *relid, void *data);
21+
extern void uint16_elem_desc(StringInfo buf, void *value, void *data);
2122

2223
#endif /* RMGRDESC_UTILS_H */

0 commit comments

Comments
 (0)