@@ -46,24 +46,27 @@ typedef struct KeyArray
46
46
* Returns amount of free space left on the page.
47
47
*/
48
48
static int32
49
- writeListPage (Relation index , Buffer buffer ,
49
+ writeListPage (Relation index , Buffer buffer , GenericXLogState * state ,
50
50
IndexTuple * tuples , int32 ntuples , BlockNumber rightlink )
51
51
{
52
- Page page = BufferGetPage ( buffer , NULL , NULL , BGP_NO_SNAPSHOT_TEST ) ;
52
+ Page page ;
53
53
int32 i ,
54
54
freesize ,
55
55
size = 0 ;
56
56
OffsetNumber l ,
57
57
off ;
58
58
char * workspace ;
59
59
char * ptr ;
60
+ GenericXLogState * state2 ;
60
61
62
+ state2 = GenericXLogStart (index );
61
63
/* workspace could be a local array; we use palloc for alignment */
62
64
workspace = palloc (BLCKSZ );
63
65
64
66
START_CRIT_SECTION ();
65
67
66
- RumInitBuffer (index , buffer , RUM_LIST );
68
+ RumInitBuffer (buffer , RUM_LIST );
69
+ page = GenericXLogRegisterBuffer (state2 , buffer , 0 );
67
70
68
71
off = FirstOffsetNumber ;
69
72
ptr = workspace ;
@@ -104,7 +107,8 @@ writeListPage(Relation index, Buffer buffer,
104
107
RumPageGetOpaque (page )-> maxoff = 0 ;
105
108
}
106
109
107
- MarkBufferDirty (buffer );
110
+ // MarkBufferDirty(buffer);
111
+ GenericXLogFinish (state2 );
108
112
109
113
/* get free space before releasing buffer */
110
114
freesize = PageGetExactFreeSpace (page );
@@ -119,8 +123,8 @@ writeListPage(Relation index, Buffer buffer,
119
123
}
120
124
121
125
static void
122
- makeSublist (Relation index , IndexTuple * tuples , int32 ntuples ,
123
- RumMetaPageData * res )
126
+ makeSublist (Relation index , GenericXLogState * state ,
127
+ IndexTuple * tuples , int32 ntuples , RumMetaPageData * res )
124
128
{
125
129
Buffer curBuffer = InvalidBuffer ;
126
130
Buffer prevBuffer = InvalidBuffer ;
@@ -143,7 +147,7 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
143
147
if (prevBuffer != InvalidBuffer )
144
148
{
145
149
res -> nPendingPages ++ ;
146
- writeListPage (index , prevBuffer ,
150
+ writeListPage (index , prevBuffer , state ,
147
151
tuples + startTuple ,
148
152
i - startTuple ,
149
153
BufferGetBlockNumber (curBuffer ));
@@ -176,7 +180,7 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
176
180
* Write last page
177
181
*/
178
182
res -> tail = BufferGetBlockNumber (curBuffer );
179
- res -> tailFreeSize = writeListPage (index , curBuffer ,
183
+ res -> tailFreeSize = writeListPage (index , curBuffer , state ,
180
184
tuples + startTuple ,
181
185
ntuples - startTuple ,
182
186
InvalidBlockNumber );
@@ -199,7 +203,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
199
203
Buffer metabuffer ;
200
204
Page metapage ;
201
205
RumMetaPageData * metadata = NULL ;
202
- RumXLogRecData rdata [2 ];
206
+ // RumXLogRecData rdata[2];
203
207
Buffer buffer = InvalidBuffer ;
204
208
Page page = NULL ;
205
209
rumxlogUpdateMeta data ;
@@ -214,10 +218,10 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
214
218
data .ntuples = 0 ;
215
219
data .newRightlink = data .prevTail = InvalidBlockNumber ;
216
220
217
- rdata [0 ].buffer = InvalidBuffer ;
218
- rdata [0 ].data = (char * ) & data ;
219
- rdata [0 ].len = sizeof (rumxlogUpdateMeta );
220
- rdata [0 ].next = NULL ;
221
+ // rdata[0].buffer = InvalidBuffer;
222
+ // rdata[0].data = (char *) &data;
223
+ // rdata[0].len = sizeof(rumxlogUpdateMeta);
224
+ // rdata[0].next = NULL;
221
225
222
226
state = GenericXLogStart (rumstate -> index );
223
227
metabuffer = ReadBuffer (index , RUM_METAPAGE_BLKNO );
@@ -257,7 +261,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
257
261
RumMetaPageData sublist ;
258
262
259
263
memset (& sublist , 0 , sizeof (RumMetaPageData ));
260
- makeSublist (index , collector -> tuples , collector -> ntuples , & sublist );
264
+ makeSublist (index , state ,
265
+ collector -> tuples , collector -> ntuples , & sublist );
261
266
262
267
/*
263
268
* metapage was unlocked, see above
@@ -291,21 +296,21 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
291
296
LockBuffer (buffer , RUM_EXCLUSIVE );
292
297
page = GenericXLogRegisterBuffer (state , buffer , 0 );
293
298
294
- rdata [0 ].next = rdata + 1 ;
295
-
296
- rdata [1 ].buffer = buffer ;
297
- rdata [1 ].buffer_std = true;
298
- rdata [1 ].data = NULL ;
299
- rdata [1 ].len = 0 ;
300
- rdata [1 ].next = NULL ;
299
+ // rdata[0].next = rdata + 1;
300
+ //
301
+ // rdata[1].buffer = buffer;
302
+ // rdata[1].buffer_std = true;
303
+ // rdata[1].data = NULL;
304
+ // rdata[1].len = 0;
305
+ // rdata[1].next = NULL;
301
306
302
307
Assert (RumPageGetOpaque (page )-> rightlink == InvalidBlockNumber );
303
308
304
309
START_CRIT_SECTION ();
305
310
306
311
RumPageGetOpaque (page )-> rightlink = sublist .head ;
307
312
308
- MarkBufferDirty (buffer );
313
+ // MarkBufferDirty(buffer);
309
314
310
315
metadata -> tail = sublist .tail ;
311
316
metadata -> tailFreeSize = sublist .tailFreeSize ;
@@ -332,13 +337,13 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
332
337
off = (PageIsEmpty (page )) ? FirstOffsetNumber :
333
338
OffsetNumberNext (PageGetMaxOffsetNumber (page ));
334
339
335
- rdata [0 ].next = rdata + 1 ;
336
-
337
- rdata [1 ].buffer = buffer ;
338
- rdata [1 ].buffer_std = true;
339
- ptr = rdata [1 ].data = (char * ) palloc (collector -> sumsize );
340
- rdata [1 ].len = collector -> sumsize ;
341
- rdata [1 ].next = NULL ;
340
+ // rdata[0].next = rdata + 1;
341
+ //
342
+ // rdata[1].buffer = buffer;
343
+ // rdata[1].buffer_std = true;
344
+ ptr /* = rdata[1].data*/ = (char * ) palloc (collector -> sumsize );
345
+ // rdata[1].len = collector->sumsize;
346
+ // rdata[1].next = NULL;
342
347
343
348
data .ntuples = collector -> ntuples ;
344
349
@@ -357,26 +362,29 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
357
362
l = PageAddItem (page , (Item ) collector -> tuples [i ], tupsize , off , false, false);
358
363
359
364
if (l == InvalidOffsetNumber )
365
+ {
366
+ GenericXLogAbort (state );
360
367
elog (ERROR , "failed to add item to index page in \"%s\"" ,
361
368
RelationGetRelationName (index ));
369
+ }
362
370
363
371
memcpy (ptr , collector -> tuples [i ], tupsize );
364
372
ptr += tupsize ;
365
373
366
374
off ++ ;
367
375
}
368
376
369
- Assert ((ptr - rdata [1 ].data ) <= collector -> sumsize );
377
+ // Assert((ptr - rdata[1].data) <= collector->sumsize);
370
378
371
379
metadata -> tailFreeSize = PageGetExactFreeSpace (page );
372
380
373
- MarkBufferDirty (buffer );
381
+ // MarkBufferDirty(buffer);
374
382
}
375
383
376
384
/*
377
385
* Write metabuffer, make xlog entry
378
386
*/
379
- MarkBufferDirty (metabuffer );
387
+ // MarkBufferDirty(metabuffer);
380
388
381
389
GenericXLogFinish (state );
382
390
0 commit comments