Skip to content

Commit 61b8f4c

Browse files
author
Artur Zakirov
committed
Rum uses Generic WAL Records
1 parent 152f5b3 commit 61b8f4c

File tree

9 files changed

+142
-375
lines changed

9 files changed

+142
-375
lines changed

rum.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -506,9 +506,9 @@ extern bytea *rumoptions(Datum reloptions, bool validate);
506506
extern Datum rumhandler(PG_FUNCTION_ARGS);
507507
extern void initRumState(RumState *state, Relation index);
508508
extern Buffer RumNewBuffer(Relation index);
509-
extern void RumInitBuffer(Buffer b, uint32 f);
509+
extern void RumInitBuffer(Relation index, Buffer buffer, uint32 flags);
510510
extern void RumInitPage(Page page, uint32 f, Size pageSize);
511-
extern void RumInitMetabuffer(Buffer b);
511+
extern void RumInitMetabuffer(Relation index, Buffer metaBuffer);
512512
extern int rumCompareEntries(RumState *rumstate, OffsetNumber attnum,
513513
Datum a, RumNullCategory categorya,
514514
Datum b, RumNullCategory categoryb);
@@ -602,8 +602,8 @@ extern RumBtreeStack *rumFindLeafPage(RumBtree btree, RumBtreeStack *stack);
602602
extern RumBtreeStack *rumReFindLeafPage(RumBtree btree, RumBtreeStack *stack);
603603
extern Buffer rumStepRight(Buffer buffer, Relation index, int lockmode);
604604
extern void freeRumBtreeStack(RumBtreeStack *stack);
605-
extern void rumInsertValue(RumBtree btree, RumBtreeStack *stack,
606-
GinStatsData *buildStats);
605+
extern void rumInsertValue(Relation index, RumBtree btree, RumBtreeStack *stack,
606+
GinStatsData *buildStats);
607607
extern void rumFindParents(RumBtree btree, RumBtreeStack *stack, BlockNumber rootBlkno);
608608

609609
/* rumentrypage.c */

rumbtree.c

Lines changed: 30 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "postgres.h"
1515

16+
#include "access/generic_xlog.h"
1617
#include "miscadmin.h"
1718
#include "utils/rel.h"
1819

@@ -347,13 +348,15 @@ rumFindParents(RumBtree btree, RumBtreeStack *stack,
347348
* NB: the passed-in stack is freed, as though by freeRumBtreeStack.
348349
*/
349350
void
350-
rumInsertValue(RumBtree btree, RumBtreeStack *stack, GinStatsData *buildStats)
351+
rumInsertValue(Relation index, RumBtree btree, RumBtreeStack *stack,
352+
GinStatsData *buildStats)
351353
{
352354
RumBtreeStack *parent;
353355
BlockNumber rootBlkno;
354356
Page page,
355357
rpage,
356358
lpage;
359+
GenericXLogState *state;
357360

358361
/* extract root BlockNumber from stack */
359362
Assert(stack != NULL);
@@ -374,21 +377,12 @@ rumInsertValue(RumBtree btree, RumBtreeStack *stack, GinStatsData *buildStats)
374377

375378
if (btree->isEnoughSpace(btree, stack->buffer, stack->off))
376379
{
377-
START_CRIT_SECTION();
378380
btree->placeToPage(btree, stack->buffer, stack->off, &rdata);
379381

380-
MarkBufferDirty(stack->buffer);
381-
382-
// if (RelationNeedsWAL(btree->index))
383-
// {
384-
// XLogRecPtr recptr;
385-
//
386-
// recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_INSERT);
387-
// PageSetLSN(page, recptr);
388-
// }
389-
390-
LockBuffer(stack->buffer, RUM_UNLOCK);
391-
END_CRIT_SECTION();
382+
state = GenericXLogStart(index);
383+
page = GenericXLogRegisterBuffer(state, stack->buffer,
384+
GENERIC_XLOG_FULL_IMAGE);
385+
GenericXLogFinish(state);
392386

393387
freeRumBtreeStack(stack);
394388

@@ -429,41 +423,32 @@ rumInsertValue(RumBtree btree, RumBtreeStack *stack, GinStatsData *buildStats)
429423
((rumxlogSplit *) (rdata->data))->isRootSplit = TRUE;
430424
((rumxlogSplit *) (rdata->data))->rrlink = InvalidBlockNumber;
431425

432-
page = BufferGetPage(stack->buffer, NULL, NULL,
433-
BGP_NO_SNAPSHOT_TEST);
434-
lpage = BufferGetPage(lbuffer, NULL, NULL,
435-
BGP_NO_SNAPSHOT_TEST);
436-
rpage = BufferGetPage(rbuffer, NULL, NULL,
437-
BGP_NO_SNAPSHOT_TEST);
426+
state = GenericXLogStart(index);
427+
428+
page = GenericXLogRegisterBuffer(state, stack->buffer,
429+
GENERIC_XLOG_FULL_IMAGE);
430+
431+
lpage = GenericXLogRegisterBuffer(state, lbuffer,
432+
GENERIC_XLOG_FULL_IMAGE);
433+
434+
rpage = GenericXLogRegisterBuffer(state, rbuffer,
435+
GENERIC_XLOG_FULL_IMAGE);
436+
438437

439438
RumPageGetOpaque(rpage)->rightlink = InvalidBlockNumber;
440439
RumPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer);
441440
((rumxlogSplit *) (rdata->data))->lblkno = BufferGetBlockNumber(lbuffer);
442441

443-
START_CRIT_SECTION();
444-
445-
RumInitBuffer(stack->buffer, RumPageGetOpaque(newlpage)->flags & ~RUM_LEAF);
442+
RumInitPage(page, RumPageGetOpaque(newlpage)->flags & ~RUM_LEAF,
443+
BufferGetPageSize(stack->buffer));
446444
PageRestoreTempPage(newlpage, lpage);
447445
btree->fillRoot(btree, stack->buffer, lbuffer, rbuffer);
448446

449-
MarkBufferDirty(rbuffer);
450-
MarkBufferDirty(lbuffer);
451-
MarkBufferDirty(stack->buffer);
452-
453-
// if (RelationNeedsWAL(btree->index))
454-
// {
455-
// XLogRecPtr recptr;
456-
//
457-
// recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT);
458-
// PageSetLSN(page, recptr);
459-
// PageSetLSN(lpage, recptr);
460-
// PageSetLSN(rpage, recptr);
461-
// }
447+
GenericXLogFinish(state);
462448

463449
UnlockReleaseBuffer(rbuffer);
464450
UnlockReleaseBuffer(lbuffer);
465451
LockBuffer(stack->buffer, RUM_UNLOCK);
466-
END_CRIT_SECTION();
467452

468453
freeRumBtreeStack(stack);
469454

@@ -484,30 +469,20 @@ rumInsertValue(RumBtree btree, RumBtreeStack *stack, GinStatsData *buildStats)
484469
((rumxlogSplit *) (rdata->data))->isRootSplit = FALSE;
485470
((rumxlogSplit *) (rdata->data))->rrlink = savedRightLink;
486471

487-
lpage = BufferGetPage(stack->buffer, NULL, NULL,
488-
BGP_NO_SNAPSHOT_TEST);
489-
rpage = BufferGetPage(rbuffer, NULL, NULL,
490-
BGP_NO_SNAPSHOT_TEST);
472+
state = GenericXLogStart(index);
473+
474+
lpage = GenericXLogRegisterBuffer(state, stack->buffer,
475+
GENERIC_XLOG_FULL_IMAGE);
476+
477+
rpage = GenericXLogRegisterBuffer(state, rbuffer,
478+
GENERIC_XLOG_FULL_IMAGE);
491479

492480
RumPageGetOpaque(rpage)->rightlink = savedRightLink;
493481
RumPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer);
494482

495-
START_CRIT_SECTION();
496483
PageRestoreTempPage(newlpage, lpage);
497484

498-
MarkBufferDirty(rbuffer);
499-
MarkBufferDirty(stack->buffer);
500-
501-
// if (RelationNeedsWAL(btree->index))
502-
// {
503-
// XLogRecPtr recptr;
504-
//
505-
// recptr = XLogInsert(RM_GIN_ID, XLOG_GIN_SPLIT);
506-
// PageSetLSN(lpage, recptr);
507-
// PageSetLSN(rpage, recptr);
508-
// }
509-
UnlockReleaseBuffer(rbuffer);
510-
END_CRIT_SECTION();
485+
GenericXLogFinish(state);
511486
}
512487
}
513488

rumdatapage.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1408,7 +1408,7 @@ rumInsertItemPointers(RumState *rumstate,
14081408
freeRumBtreeStack(gdi->stack);
14091409
}
14101410
else
1411-
rumInsertValue(&(gdi->btree), gdi->stack, buildStats);
1411+
rumInsertValue(rumstate->index, &(gdi->btree), gdi->stack, buildStats);
14121412

14131413
gdi->stack = NULL;
14141414
}

rumfast.c

Lines changed: 33 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "postgres.h"
1818

19+
#include "access/generic_xlog.h"
1920
#include "access/htup_details.h"
2021
#include "commands/vacuum.h"
2122
#include "miscadmin.h"
@@ -62,7 +63,7 @@ writeListPage(Relation index, Buffer buffer,
6263

6364
START_CRIT_SECTION();
6465

65-
RumInitBuffer(buffer, RUM_LIST);
66+
RumInitBuffer(index, buffer, RUM_LIST);
6667

6768
off = FirstOffsetNumber;
6869
ptr = workspace;
@@ -105,31 +106,6 @@ writeListPage(Relation index, Buffer buffer,
105106

106107
MarkBufferDirty(buffer);
107108

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-
133109
/* get free space before releasing buffer */
134110
freesize = PageGetExactFreeSpace(page);
135111

@@ -229,6 +205,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
229205
rumxlogUpdateMeta data;
230206
bool separateList = false;
231207
bool needCleanup = false;
208+
GenericXLogState *state;
232209

233210
if (collector->ntuples == 0)
234211
return;
@@ -242,8 +219,10 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
242219
rdata[0].len = sizeof(rumxlogUpdateMeta);
243220
rdata[0].next = NULL;
244221

222+
state = GenericXLogStart(rumstate->index);
245223
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);
247226

248227
if (collector->sumsize + collector->ntuples * sizeof(ItemIdData) > RumListPageSize)
249228
{
@@ -311,7 +290,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
311290

312291
buffer = ReadBuffer(index, metadata->tail);
313292
LockBuffer(buffer, RUM_EXCLUSIVE);
314-
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
293+
page = GenericXLogRegisterBuffer(state, buffer,
294+
GENERIC_XLOG_FULL_IMAGE);
315295

316296
rdata[0].next = rdata + 1;
317297

@@ -349,7 +329,8 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
349329

350330
buffer = ReadBuffer(index, metadata->tail);
351331
LockBuffer(buffer, RUM_EXCLUSIVE);
352-
page = BufferGetPage(buffer, NULL, NULL, BGP_NO_SNAPSHOT_TEST);
332+
page = GenericXLogRegisterBuffer(state, buffer,
333+
GENERIC_XLOG_FULL_IMAGE);
353334

354335
off = (PageIsEmpty(page)) ? FirstOffsetNumber :
355336
OffsetNumberNext(PageGetMaxOffsetNumber(page));
@@ -400,20 +381,7 @@ rumHeapTupleFastInsert(RumState *rumstate, RumTupleCollector *collector)
400381
*/
401382
MarkBufferDirty(metabuffer);
402383

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);
417385

418386
if (buffer != InvalidBuffer)
419387
UnlockReleaseBuffer(buffer);
@@ -598,11 +566,14 @@ static bool
598566
shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
599567
IndexBulkDeleteResult *stats)
600568
{
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);
606577
metadata = RumPageGetMeta(metapage);
607578
blknoToDelete = metadata->head;
608579

@@ -612,29 +583,29 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
612583
int i;
613584
int64 nDeletedHeapTuples = 0;
614585
rumxlogDeleteListPages data;
615-
// XLogRecData rdata[1];
616586
Buffer buffers[RUM_NDELETE_AT_ONCE];
587+
GenericXLogState *state;
617588

618-
data.node = index->rd_node;
589+
state = GenericXLogStart(index);
619590

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;
624592

625593
data.ndeleted = 0;
626594
while (data.ndeleted < RUM_NDELETE_AT_ONCE && blknoToDelete != newHead)
627595
{
628596
data.toDelete[data.ndeleted] = blknoToDelete;
629597
buffers[data.ndeleted] = ReadBuffer(index, blknoToDelete);
630598
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);
633602

634603
data.ndeleted++;
635604

636605
if (RumPageIsDeleted(page))
637606
{
607+
GenericXLogAbort(state);
608+
GenericXLogAbort(metastate);
638609
/* concurrent cleanup process is detected */
639610
for (i = 0; i < data.ndeleted; i++)
640611
UnlockReleaseBuffer(buffers[i]);
@@ -670,34 +641,23 @@ shiftList(Relation index, Buffer metabuffer, BlockNumber newHead,
670641

671642
for (i = 0; i < data.ndeleted; i++)
672643
{
673-
page = BufferGetPage(buffers[i], NULL, NULL, BGP_NO_SNAPSHOT_TEST);
644+
page = GenericXLogRegisterBuffer(state, buffers[i],
645+
GENERIC_XLOG_FULL_IMAGE);
646+
674647
RumPageGetOpaque(page)->flags = RUM_DELETED;
675648
MarkBufferDirty(buffers[i]);
676649
}
677650

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);
694652

695653
for (i = 0; i < data.ndeleted; i++)
696654
UnlockReleaseBuffer(buffers[i]);
697655

698656
END_CRIT_SECTION();
699657
} while (blknoToDelete != newHead);
700658

659+
GenericXLogFinish(metastate);
660+
701661
return false;
702662
}
703663

rumget.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2082,8 +2082,6 @@ rumgetbitmap(IndexScanDesc scan, TIDBitmap *tbm)
20822082
int64 ntids;
20832083
bool recheck;
20842084

2085-
elog(LOG, "rumgetbitmap");
2086-
20872085
/*
20882086
* Set up the scan keys, and check for unsatisfiable query.
20892087
*/

0 commit comments

Comments
 (0)