17
17
#include "access/nbtxlog.h"
18
18
#include "access/rmgrdesc_utils.h"
19
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
- }
20
+ static void delvacuum_desc (StringInfo buf , char * block_data ,
21
+ uint16 ndeleted , uint16 nupdated );
73
22
74
23
void
75
24
btree_desc (StringInfo buf , XLogReaderState * record )
@@ -114,9 +63,8 @@ btree_desc(StringInfo buf, XLogReaderState *record)
114
63
xlrec -> ndeleted , xlrec -> nupdated );
115
64
116
65
if (!XLogRecHasBlockImage (record , 0 ))
117
- btree_del_desc (buf , XLogRecGetBlockData (record , 0 , NULL ),
66
+ delvacuum_desc (buf , XLogRecGetBlockData (record , 0 , NULL ),
118
67
xlrec -> ndeleted , xlrec -> nupdated );
119
-
120
68
break ;
121
69
}
122
70
case XLOG_BTREE_DELETE :
@@ -128,16 +76,15 @@ btree_desc(StringInfo buf, XLogReaderState *record)
128
76
xlrec -> ndeleted , xlrec -> nupdated );
129
77
130
78
if (!XLogRecHasBlockImage (record , 0 ))
131
- btree_del_desc (buf , XLogRecGetBlockData (record , 0 , NULL ),
79
+ delvacuum_desc (buf , XLogRecGetBlockData (record , 0 , NULL ),
132
80
xlrec -> ndeleted , xlrec -> nupdated );
133
-
134
81
break ;
135
82
}
136
83
case XLOG_BTREE_MARK_PAGE_HALFDEAD :
137
84
{
138
85
xl_btree_mark_page_halfdead * xlrec = (xl_btree_mark_page_halfdead * ) rec ;
139
86
140
- appendStringInfo (buf , "topparent: %u; leaf: %u; left: %u; right: %u" ,
87
+ appendStringInfo (buf , "topparent: %u, leaf: %u, left: %u, right: %u" ,
141
88
xlrec -> topparent , xlrec -> leafblk , xlrec -> leftblk , xlrec -> rightblk );
142
89
break ;
143
90
}
@@ -146,11 +93,11 @@ btree_desc(StringInfo buf, XLogReaderState *record)
146
93
{
147
94
xl_btree_unlink_page * xlrec = (xl_btree_unlink_page * ) rec ;
148
95
149
- appendStringInfo (buf , "left: %u; right: %u; level: %u; safexid: %u:%u; " ,
96
+ appendStringInfo (buf , "left: %u, right: %u, level: %u, safexid: %u:%u, " ,
150
97
xlrec -> leftsib , xlrec -> rightsib , xlrec -> level ,
151
98
EpochFromFullTransactionId (xlrec -> safexid ),
152
99
XidFromFullTransactionId (xlrec -> safexid ));
153
- appendStringInfo (buf , "leafleft: %u; leafright: %u; leaftopparent: %u" ,
100
+ appendStringInfo (buf , "leafleft: %u, leafright: %u, leaftopparent: %u" ,
154
101
xlrec -> leafleftsib , xlrec -> leafrightsib ,
155
102
xlrec -> leaftopparent );
156
103
break ;
@@ -242,3 +189,59 @@ btree_identify(uint8 info)
242
189
243
190
return id ;
244
191
}
192
+
193
+ static void
194
+ delvacuum_desc (StringInfo buf , char * block_data ,
195
+ uint16 ndeleted , uint16 nupdated )
196
+ {
197
+ OffsetNumber * deletedoffsets ;
198
+ OffsetNumber * updatedoffsets ;
199
+ xl_btree_update * updates ;
200
+
201
+ /* Output deleted page offset number array */
202
+ appendStringInfoString (buf , ", deleted:" );
203
+ deletedoffsets = (OffsetNumber * ) block_data ;
204
+ array_desc (buf , deletedoffsets , sizeof (OffsetNumber ), ndeleted ,
205
+ & offset_elem_desc , NULL );
206
+
207
+ /*
208
+ * Output updates as an array of "update objects", where each element
209
+ * contains a page offset number from updated array. (This is not the
210
+ * most literal representation of the underlying physical data structure
211
+ * that we could use. Readability seems more important here.)
212
+ */
213
+ appendStringInfoString (buf , ", updated: [" );
214
+ updatedoffsets = (OffsetNumber * ) (block_data + ndeleted *
215
+ sizeof (OffsetNumber ));
216
+ updates = (xl_btree_update * ) ((char * ) updatedoffsets +
217
+ nupdated *
218
+ sizeof (OffsetNumber ));
219
+ for (int i = 0 ; i < nupdated ; i ++ )
220
+ {
221
+ OffsetNumber off = updatedoffsets [i ];
222
+
223
+ Assert (OffsetNumberIsValid (off ));
224
+ Assert (updates -> ndeletedtids > 0 );
225
+
226
+ appendStringInfo (buf , "{ off: %u, nptids: %u, ptids: [" ,
227
+ off , updates -> ndeletedtids );
228
+ for (int p = 0 ; p < updates -> ndeletedtids ; p ++ )
229
+ {
230
+ uint16 * ptid ;
231
+
232
+ ptid = (uint16 * ) ((char * ) updates + SizeOfBtreeUpdate ) + p ;
233
+ appendStringInfo (buf , "%u" , * ptid );
234
+
235
+ if (p < updates -> ndeletedtids - 1 )
236
+ appendStringInfoString (buf , ", " );
237
+ }
238
+ appendStringInfoString (buf , "] }" );
239
+ if (i < nupdated - 1 )
240
+ appendStringInfoString (buf , ", " );
241
+
242
+ updates = (xl_btree_update * )
243
+ ((char * ) updates + SizeOfBtreeUpdate +
244
+ updates -> ndeletedtids * sizeof (uint16 ));
245
+ }
246
+ appendStringInfoString (buf , "]" );
247
+ }
0 commit comments