@@ -47,33 +47,33 @@ typedef struct KeyArray
47
47
*
48
48
* Returns amount of free space left on the page.
49
49
*/
50
- static int32
51
- writeListPage (Relation index , Buffer buffer ,
52
- IndexTuple * tuples , int32 ntuples , BlockNumber rightlink )
50
+ static uint32
51
+ writeListPage (RumState * rumstate , Buffer buffer ,
52
+ IndexTuple * tuples , uint32 ntuples , BlockNumber rightlink )
53
53
{
54
54
Page page ;
55
- int32 i ,
55
+ uint32 i ,
56
56
freesize ;
57
57
OffsetNumber l ,
58
58
off ;
59
59
GenericXLogState * state ;
60
60
61
- state = GenericXLogStart ( index );
61
+ state = RumGenericXLogStart ( rumstate -> index , rumstate -> isBuild );
62
62
63
- page = GenericXLogRegisterBuffer (state , buffer , 0 );
63
+ page = RumGenericXLogRegisterBuffer (state , buffer , 0 , rumstate -> isBuild );
64
64
RumInitPage (page , RUM_LIST , BufferGetPageSize (buffer ));
65
65
66
66
off = FirstOffsetNumber ;
67
67
68
68
for (i = 0 ; i < ntuples ; i ++ )
69
69
{
70
- int this_size = IndexTupleSize (tuples [i ]);
70
+ Size this_size = IndexTupleSize (tuples [i ]);
71
71
72
72
l = PageAddItem (page , (Item ) tuples [i ], this_size , off , false, false);
73
73
74
74
if (l == InvalidOffsetNumber )
75
75
elog (ERROR , "failed to add item to index page in \"%s\"" ,
76
- RelationGetRelationName (index ));
76
+ RelationGetRelationName (rumstate -> index ));
77
77
78
78
off ++ ;
79
79
}
@@ -97,22 +97,22 @@ writeListPage(Relation index, Buffer buffer,
97
97
98
98
/* get free space before releasing buffer */
99
99
freesize = PageGetExactFreeSpace (page );
100
- GenericXLogFinish (state );
100
+ RumGenericXLogFinish (state , rumstate -> isBuild );
101
101
UnlockReleaseBuffer (buffer );
102
102
103
103
return freesize ;
104
104
}
105
105
106
106
static void
107
- makeSublist (Relation index , IndexTuple * tuples , int32 ntuples ,
107
+ makeSublist (RumState * rumstate , IndexTuple * tuples , uint32 ntuples ,
108
108
RumMetaPageData * res )
109
109
{
110
110
Buffer curBuffer = InvalidBuffer ;
111
111
Buffer prevBuffer = InvalidBuffer ;
112
- int i ,
113
- size = 0 ,
112
+ uint32 i ,
113
+ startTuple = 0 ;
114
+ uint64 size = 0 ,
114
115
tupsize ;
115
- int startTuple = 0 ;
116
116
117
117
Assert (ntuples > 0 );
118
118
@@ -123,12 +123,12 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
123
123
{
124
124
if (curBuffer == InvalidBuffer )
125
125
{
126
- curBuffer = RumNewBuffer (index );
126
+ curBuffer = RumNewBuffer (rumstate -> index );
127
127
128
128
if (prevBuffer != InvalidBuffer )
129
129
{
130
130
res -> nPendingPages ++ ;
131
- writeListPage (index , prevBuffer ,
131
+ writeListPage (rumstate , prevBuffer ,
132
132
tuples + startTuple ,
133
133
i - startTuple ,
134
134
BufferGetBlockNumber (curBuffer ));
@@ -161,7 +161,7 @@ makeSublist(Relation index, IndexTuple *tuples, int32 ntuples,
161
161
* Write last page
162
162
*/
163
163
res -> tail = BufferGetBlockNumber (curBuffer );
164
- res -> tailFreeSize = writeListPage (index , curBuffer ,
164
+ res -> tailFreeSize = writeListPage (rumstate , curBuffer ,
165
165
tuples + startTuple ,
166
166
ntuples - startTuple ,
167
167
InvalidBlockNumber );
@@ -193,7 +193,7 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
193
193
if (collector -> ntuples == 0 )
194
194
return ;
195
195
196
- state = GenericXLogStart (rumstate -> index );
196
+ state = RumGenericXLogStart (rumstate -> index , rumstate -> isBuild );
197
197
metabuffer = ReadBuffer (index , RUM_METAPAGE_BLKNO );
198
198
199
199
if (collector -> sumsize + collector -> ntuples * sizeof (ItemIdData ) > RumListPageSize )
@@ -230,13 +230,14 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
230
230
RumMetaPageData sublist ;
231
231
232
232
memset (& sublist , 0 , sizeof (RumMetaPageData ));
233
- makeSublist (index , collector -> tuples , collector -> ntuples , & sublist );
233
+ makeSublist (rumstate , collector -> tuples , collector -> ntuples , & sublist );
234
234
235
235
/*
236
236
* metapage was unlocked, see above
237
237
*/
238
238
LockBuffer (metabuffer , RUM_EXCLUSIVE );
239
- metapage = GenericXLogRegisterBuffer (state , metabuffer , 0 );
239
+ metapage = RumGenericXLogRegisterBuffer (state , metabuffer , 0 ,
240
+ rumstate -> isBuild );
240
241
metadata = RumPageGetMeta (metapage );
241
242
242
243
if (metadata -> head == InvalidBlockNumber )
@@ -259,7 +260,8 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
259
260
260
261
buffer = ReadBuffer (index , metadata -> tail );
261
262
LockBuffer (buffer , RUM_EXCLUSIVE );
262
- page = GenericXLogRegisterBuffer (state , buffer , 0 );
263
+ page = RumGenericXLogRegisterBuffer (state , buffer , 0 ,
264
+ rumstate -> isBuild );
263
265
264
266
Assert (RumPageGetOpaque (page )-> rightlink == InvalidBlockNumber );
265
267
@@ -279,15 +281,16 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
279
281
*/
280
282
OffsetNumber l ,
281
283
off ;
282
- int i ,
283
- tupsize ;
284
+ uint32 i ;
285
+ Size tupsize ;
284
286
285
- metapage = GenericXLogRegisterBuffer (state , metabuffer , 0 );
287
+ metapage = RumGenericXLogRegisterBuffer (state , metabuffer , 0 ,
288
+ rumstate -> isBuild );
286
289
metadata = RumPageGetMeta (metapage );
287
290
288
291
buffer = ReadBuffer (index , metadata -> tail );
289
292
LockBuffer (buffer , RUM_EXCLUSIVE );
290
- page = GenericXLogRegisterBuffer (state , buffer , 0 );
293
+ page = RumGenericXLogRegisterBuffer (state , buffer , 0 , rumstate -> isBuild );
291
294
292
295
off = (PageIsEmpty (page )) ? FirstOffsetNumber :
293
296
OffsetNumberNext (PageGetMaxOffsetNumber (page ));
@@ -306,7 +309,7 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
306
309
307
310
if (l == InvalidOffsetNumber )
308
311
{
309
- GenericXLogAbort (state );
312
+ RumGenericXLogAbort (state , rumstate -> isBuild );
310
313
elog (ERROR , "failed to add item to index page in \"%s\"" ,
311
314
RelationGetRelationName (index ));
312
315
}
@@ -329,7 +332,7 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
329
332
if (metadata -> nPendingPages * RUM_PAGE_FREESIZE > work_mem * 1024L )
330
333
needCleanup = true;
331
334
332
- GenericXLogFinish (state );
335
+ RumGenericXLogFinish (state , rumstate -> isBuild );
333
336
334
337
if (buffer != InvalidBuffer )
335
338
UnlockReleaseBuffer (buffer );
@@ -349,7 +352,7 @@ RumFastFormTuple(RumState * rumstate,
349
352
Datum datums [3 ];
350
353
bool isnull [3 ];
351
354
IndexTuple itup ;
352
- uint32 newsize ;
355
+ Size newsize ;
353
356
354
357
/* Build the basic tuple: optional column number, plus key datum */
355
358
@@ -380,7 +383,7 @@ RumFastFormTuple(RumState * rumstate,
380
383
381
384
if (category != RUM_CAT_NORM_KEY )
382
385
{
383
- uint32 minsize ;
386
+ Size minsize ;
384
387
385
388
Assert (IndexTupleHasNulls (itup ));
386
389
minsize = IndexInfoFindDataOffset (itup -> t_info ) +
@@ -497,17 +500,18 @@ rumHeapTupleFastCollect(RumState * rumstate,
497
500
* (if so, we can just abandon our own efforts)
498
501
*/
499
502
static bool
500
- shiftList (Relation index , Buffer metabuffer , BlockNumber newHead ,
503
+ shiftList (RumState * rumstate , Buffer metabuffer , BlockNumber newHead ,
501
504
IndexBulkDeleteResult * stats )
502
505
{
503
506
Page metapage ;
504
507
RumMetaPageData * metadata ;
505
508
BlockNumber blknoToDelete ;
506
509
GenericXLogState * metastate ;
507
510
508
- metastate = GenericXLogStart (index );
509
- metapage = GenericXLogRegisterBuffer (metastate , metabuffer ,
510
- GENERIC_XLOG_FULL_IMAGE );
511
+ metastate = RumGenericXLogStart (rumstate -> index , rumstate -> isBuild );
512
+ metapage = RumGenericXLogRegisterBuffer (metastate , metabuffer ,
513
+ GENERIC_XLOG_FULL_IMAGE ,
514
+ rumstate -> isBuild );
511
515
metadata = RumPageGetMeta (metapage );
512
516
blknoToDelete = metadata -> head ;
513
517
@@ -522,7 +526,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
522
526
523
527
while (nDeleted < RUM_NDELETE_AT_ONCE && blknoToDelete != newHead )
524
528
{
525
- buffers [nDeleted ] = ReadBuffer (index , blknoToDelete );
529
+ buffers [nDeleted ] = ReadBuffer (rumstate -> index , blknoToDelete );
526
530
LockBuffer (buffers [nDeleted ], RUM_EXCLUSIVE );
527
531
528
532
page = BufferGetPage (buffers [nDeleted ]);
@@ -531,7 +535,7 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
531
535
532
536
if (RumPageIsDeleted (page ))
533
537
{
534
- GenericXLogAbort (metastate );
538
+ RumGenericXLogAbort (metastate , rumstate -> isBuild );
535
539
/* concurrent cleanup process is detected */
536
540
for (i = 0 ; i < nDeleted ; i ++ )
537
541
UnlockReleaseBuffer (buffers [i ]);
@@ -565,18 +569,19 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
565
569
566
570
for (i = 0 ; i < nDeleted ; i ++ )
567
571
{
568
- state = GenericXLogStart (index );
569
- page = GenericXLogRegisterBuffer (state , buffers [i ], 0 );
572
+ state = RumGenericXLogStart (rumstate -> index , rumstate -> isBuild );
573
+ page = RumGenericXLogRegisterBuffer (state , buffers [i ], 0 ,
574
+ rumstate -> isBuild );
570
575
571
576
RumPageGetOpaque (page )-> flags = RUM_DELETED ;
572
- GenericXLogFinish (state );
577
+ RumGenericXLogFinish (state , rumstate -> isBuild );
573
578
}
574
579
575
580
for (i = 0 ; i < nDeleted ; i ++ )
576
581
UnlockReleaseBuffer (buffers [i ]);
577
582
} while (blknoToDelete != newHead );
578
583
579
- GenericXLogFinish (metastate );
584
+ RumGenericXLogFinish (metastate , rumstate -> isBuild );
580
585
581
586
return false;
582
587
}
@@ -882,7 +887,7 @@ rumInsertCleanup(RumState * rumstate,
882
887
* remove read pages from pending list, at this point all content
883
888
* of read pages is in regular structure
884
889
*/
885
- if (shiftList (index , metabuffer , blkno , stats ))
890
+ if (shiftList (rumstate , metabuffer , blkno , stats ))
886
891
{
887
892
/* another cleanup process is running concurrently */
888
893
LockBuffer (metabuffer , RUM_UNLOCK );
0 commit comments