16
16
17
17
#include "postgres.h"
18
18
19
+ #include "access/generic_xlog.h"
19
20
#include "access/htup_details.h"
20
21
#include "commands/vacuum.h"
21
22
#include "miscadmin.h"
@@ -62,7 +63,7 @@ writeListPage(Relation index, Buffer buffer,
62
63
63
64
START_CRIT_SECTION ();
64
65
65
- RumInitBuffer (buffer , RUM_LIST );
66
+ RumInitBuffer (index , buffer , RUM_LIST );
66
67
67
68
off = FirstOffsetNumber ;
68
69
ptr = workspace ;
@@ -105,31 +106,6 @@ writeListPage(Relation index, Buffer buffer,
105
106
106
107
MarkBufferDirty (buffer );
107
108
108
- // if (RelationNeedsWAL(index))
109
- // {
110
- // XLogRecData rdata[2];
111
- // rumxlogInsertListPage data;
112
- // XLogRecPtr recptr;
113
- //
114
- // data.node = index->rd_node;
115
- // data.blkno = BufferGetBlockNumber(buffer);
116
- // data.rightlink = rightlink;
117
- // data.ntuples = ntuples;
118
- //
119
- // rdata[0].buffer = InvalidBuffer;
120
- // rdata[0].data = (char *) &data;
121
- // rdata[0].len = sizeof(rumxlogInsertListPage);
122
- // rdata[0].next = rdata + 1;
123
- //
124
- // rdata[1].buffer = InvalidBuffer;
125
- // rdata[1].data = workspace;
126
- // rdata[1].len = size;
127
- // rdata[1].next = NULL;
128
- //
129
- // recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT_LISTPAGE, rdata);
130
- // PageSetLSN(page, recptr);
131
- // }
132
-
133
109
/* get free space before releasing buffer */
134
110
freesize = PageGetExactFreeSpace (page );
135
111
@@ -229,6 +205,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
229
205
rumxlogUpdateMeta data ;
230
206
bool separateList = false;
231
207
bool needCleanup = false;
208
+ GenericXLogState * state ;
232
209
233
210
if (collector -> ntuples == 0 )
234
211
return ;
@@ -242,8 +219,10 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
242
219
rdata [0 ].len = sizeof (rumxlogUpdateMeta );
243
220
rdata [0 ].next = NULL ;
244
221
222
+ state = GenericXLogStart (rumstate -> index );
245
223
metabuffer = ReadBuffer (index , RUM_METAPAGE_BLKNO );
246
- metapage = BufferGetPage (metabuffer , NULL , NULL , BGP_NO_SNAPSHOT_TEST );
224
+ metapage = GenericXLogRegisterBuffer (state , metabuffer ,
225
+ GENERIC_XLOG_FULL_IMAGE );
247
226
248
227
if (collector -> sumsize + collector -> ntuples * sizeof (ItemIdData ) > RumListPageSize )
249
228
{
@@ -311,7 +290,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
311
290
312
291
buffer = ReadBuffer (index , metadata -> tail );
313
292
LockBuffer (buffer , RUM_EXCLUSIVE );
314
- page = BufferGetPage (buffer , NULL , NULL , BGP_NO_SNAPSHOT_TEST );
293
+ page = GenericXLogRegisterBuffer (state , buffer ,
294
+ GENERIC_XLOG_FULL_IMAGE );
315
295
316
296
rdata [0 ].next = rdata + 1 ;
317
297
@@ -349,7 +329,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
349
329
350
330
buffer = ReadBuffer (index , metadata -> tail );
351
331
LockBuffer (buffer , RUM_EXCLUSIVE );
352
- page = BufferGetPage (buffer , NULL , NULL , BGP_NO_SNAPSHOT_TEST );
332
+ page = GenericXLogRegisterBuffer (state , buffer ,
333
+ GENERIC_XLOG_FULL_IMAGE );
353
334
354
335
off = (PageIsEmpty (page )) ? FirstOffsetNumber :
355
336
OffsetNumberNext (PageGetMaxOffsetNumber (page ));
@@ -400,20 +381,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
400
381
*/
401
382
MarkBufferDirty (metabuffer );
402
383
403
- // if (RelationNeedsWAL(index))
404
- // {
405
- // XLogRecPtr recptr;
406
- //
407
- // memcpy(&data.metadata, metadata, sizeof(RumMetaPageData));
408
- //
409
- // recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_UPDATE_META_PAGE, rdata);
410
- // PageSetLSN(metapage, recptr);
411
- //
412
- // if (buffer != InvalidBuffer)
413
- // {
414
- // PageSetLSN(page, recptr);
415
- // }
416
- // }
384
+ GenericXLogFinish (state );
417
385
418
386
if (buffer != InvalidBuffer )
419
387
UnlockReleaseBuffer (buffer );
@@ -598,11 +566,14 @@ static bool
598
566
shiftList (Relation index , Buffer metabuffer , BlockNumber newHead ,
599
567
IndexBulkDeleteResult * stats )
600
568
{
601
- Page metapage ;
602
- RumMetaPageData * metadata ;
603
- BlockNumber blknoToDelete ;
604
-
605
- metapage = BufferGetPage (metabuffer , NULL , NULL , BGP_NO_SNAPSHOT_TEST );
569
+ Page metapage ;
570
+ RumMetaPageData * metadata ;
571
+ BlockNumber blknoToDelete ;
572
+ GenericXLogState * metastate ;
573
+
574
+ metastate = GenericXLogStart (index );
575
+ metapage = GenericXLogRegisterBuffer (metastate , metabuffer ,
576
+ GENERIC_XLOG_FULL_IMAGE );
606
577
metadata = RumPageGetMeta (metapage );
607
578
blknoToDelete = metadata -> head ;
608
579
@@ -612,29 +583,29 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
612
583
int i ;
613
584
int64 nDeletedHeapTuples = 0 ;
614
585
rumxlogDeleteListPages data ;
615
- // XLogRecData rdata[1];
616
586
Buffer buffers [RUM_NDELETE_AT_ONCE ];
587
+ GenericXLogState * state ;
617
588
618
- data . node = index -> rd_node ;
589
+ state = GenericXLogStart ( index ) ;
619
590
620
- // rdata[0].buffer = InvalidBuffer;
621
- // rdata[0].data = (char *) &data;
622
- // rdata[0].len = sizeof(rumxlogDeleteListPages);
623
- // rdata[0].next = NULL;
591
+ data .node = index -> rd_node ;
624
592
625
593
data .ndeleted = 0 ;
626
594
while (data .ndeleted < RUM_NDELETE_AT_ONCE && blknoToDelete != newHead )
627
595
{
628
596
data .toDelete [data .ndeleted ] = blknoToDelete ;
629
597
buffers [data .ndeleted ] = ReadBuffer (index , blknoToDelete );
630
598
LockBuffer (buffers [data .ndeleted ], RUM_EXCLUSIVE );
631
- page = BufferGetPage (buffers [data .ndeleted ], NULL , NULL ,
632
- BGP_NO_SNAPSHOT_TEST );
599
+
600
+ page = GenericXLogRegisterBuffer (state , buffers [data .ndeleted ],
601
+ GENERIC_XLOG_FULL_IMAGE );
633
602
634
603
data .ndeleted ++ ;
635
604
636
605
if (RumPageIsDeleted (page ))
637
606
{
607
+ GenericXLogAbort (state );
608
+ GenericXLogAbort (metastate );
638
609
/* concurrent cleanup process is detected */
639
610
for (i = 0 ; i < data .ndeleted ; i ++ )
640
611
UnlockReleaseBuffer (buffers [i ]);
@@ -670,34 +641,23 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
670
641
671
642
for (i = 0 ; i < data .ndeleted ; i ++ )
672
643
{
673
- page = BufferGetPage (buffers [i ], NULL , NULL , BGP_NO_SNAPSHOT_TEST );
644
+ page = GenericXLogRegisterBuffer (state , buffers [i ],
645
+ GENERIC_XLOG_FULL_IMAGE );
646
+
674
647
RumPageGetOpaque (page )-> flags = RUM_DELETED ;
675
648
MarkBufferDirty (buffers [i ]);
676
649
}
677
650
678
- // if (RelationNeedsWAL(index))
679
- // {
680
- // XLogRecPtr recptr;
681
- //
682
- // memcpy(&data.metadata, metadata, sizeof(RumMetaPageData));
683
- //
684
- // recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_DELETE_LISTPAGE, rdata);
685
- // PageSetLSN(metapage, recptr);
686
- //
687
- // for (i = 0; i < data.ndeleted; i++)
688
- // {
689
- // page = BufferGetPage(buffers[i], NULL, NULL,
690
- // BGP_NO_SNAPSHOT_TEST);
691
- // PageSetLSN(page, recptr);
692
- // }
693
- // }
651
+ GenericXLogFinish (state );
694
652
695
653
for (i = 0 ; i < data .ndeleted ; i ++ )
696
654
UnlockReleaseBuffer (buffers [i ]);
697
655
698
656
END_CRIT_SECTION ();
699
657
} while (blknoToDelete != newHead );
700
658
659
+ GenericXLogFinish (metastate );
660
+
701
661
return false;
702
662
}
703
663
0 commit comments