Skip to content

Commit dd83c34

Browse files
author
Artur Zakirov
committed
Use MarkBufferDirty() to save changes in page
1 parent 1edaaca commit dd83c34

File tree

4 files changed

+124
-32
lines changed

4 files changed

+124
-32
lines changed

rumbtree.c

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "postgres.h"
1515

1616
#include "access/generic_xlog.h"
17+
#include "miscadmin.h"
1718

1819
#include "rum.h"
1920

@@ -399,13 +400,27 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
399400

400401
if (btree->isEnoughSpace(btree, stack->buffer, stack->off))
401402
{
402-
state = GenericXLogStart(index);
403-
page = GenericXLogRegisterBuffer(state, stack->buffer, 0);
403+
if (btree->rumstate->isBuild)
404+
{
405+
page = BufferGetPage(stack->buffer);
406+
START_CRIT_SECTION();
407+
}
408+
else
409+
{
410+
state = GenericXLogStart(index);
411+
page = GenericXLogRegisterBuffer(state, stack->buffer, 0);
412+
}
404413

405414
btree->placeToPage(btree, page, stack->off);
406-
GenericXLogFinish(state);
415+
416+
if (btree->rumstate->isBuild)
417+
MarkBufferDirty(stack->buffer);
418+
else
419+
GenericXLogFinish(state);
407420

408421
LockBuffer(stack->buffer, RUM_UNLOCK);
422+
if (btree->rumstate->isBuild)
423+
END_CRIT_SECTION();
409424
freeRumBtreeStack(stack);
410425

411426
return;
@@ -430,11 +445,19 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
430445
{
431446
Buffer lbuffer;
432447

433-
state = GenericXLogStart(index);
448+
if (btree->rumstate->isBuild)
449+
{
450+
page = BufferGetPage(stack->buffer);
451+
rpage = BufferGetPage(rbuffer);
452+
}
453+
else
454+
{
455+
state = GenericXLogStart(index);
434456

435-
page = GenericXLogRegisterBuffer(state, stack->buffer, 0);
436-
rpage = GenericXLogRegisterBuffer(state, rbuffer,
437-
GENERIC_XLOG_FULL_IMAGE);
457+
page = GenericXLogRegisterBuffer(state, stack->buffer, 0);
458+
rpage = GenericXLogRegisterBuffer(state, rbuffer,
459+
GENERIC_XLOG_FULL_IMAGE);
460+
}
438461

439462
/*
440463
* newlpage is a pointer to memory page, it doesn't associate
@@ -448,8 +471,11 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
448471
* pointer on root to left and right page
449472
*/
450473
lbuffer = RumNewBuffer(btree->index);
451-
lpage = GenericXLogRegisterBuffer(state, lbuffer,
452-
GENERIC_XLOG_FULL_IMAGE);
474+
if (btree->rumstate->isBuild)
475+
lpage = BufferGetPage(lbuffer);
476+
else
477+
lpage = GenericXLogRegisterBuffer(state, lbuffer,
478+
GENERIC_XLOG_FULL_IMAGE);
453479

454480
RumPageGetOpaque(rpage)->rightlink = InvalidBlockNumber;
455481
RumPageGetOpaque(newlpage)->leftlink = InvalidBlockNumber;
@@ -462,12 +488,23 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
462488
btree->fillRoot(btree, stack->buffer, lbuffer, rbuffer,
463489
page, lpage, rpage);
464490

465-
GenericXLogFinish(state);
491+
if (btree->rumstate->isBuild)
492+
{
493+
START_CRIT_SECTION();
494+
MarkBufferDirty(rbuffer);
495+
MarkBufferDirty(lbuffer);
496+
MarkBufferDirty(stack->buffer);
497+
}
498+
else
499+
GenericXLogFinish(state);
466500

467501
UnlockReleaseBuffer(rbuffer);
468502
UnlockReleaseBuffer(lbuffer);
469503
LockBuffer(stack->buffer, RUM_UNLOCK);
470504

505+
if (btree->rumstate->isBuild)
506+
END_CRIT_SECTION();
507+
471508
freeRumBtreeStack(stack);
472509

473510
/* During index build, count the newly-added root page */
@@ -484,11 +521,18 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
484521
else
485522
{
486523
/* split non-root page */
524+
if (btree->rumstate->isBuild)
525+
{
526+
lpage = BufferGetPage(stack->buffer);
527+
rpage = BufferGetPage(rbuffer);
528+
}
529+
else
530+
{
531+
state = GenericXLogStart(index);
487532

488-
state = GenericXLogStart(index);
489-
490-
lpage = GenericXLogRegisterBuffer(state, stack->buffer, 0);
491-
rpage = GenericXLogRegisterBuffer(state, rbuffer, 0);
533+
lpage = GenericXLogRegisterBuffer(state, stack->buffer, 0);
534+
rpage = GenericXLogRegisterBuffer(state, rbuffer, 0);
535+
}
492536

493537
/*
494538
* newlpage is a pointer to memory page, it doesn't associate
@@ -502,11 +546,21 @@ rumInsertValue(Relation index, RumBtree btree, RumBtreeStack * stack,
502546
RumPageGetOpaque(rpage)->leftlink = BufferGetBlockNumber(stack->buffer);
503547
RumPageGetOpaque(newlpage)->rightlink = BufferGetBlockNumber(rbuffer);
504548

549+
if (btree->rumstate->isBuild)
550+
START_CRIT_SECTION();
505551
PageRestoreTempPage(newlpage, lpage);
506552

507-
GenericXLogFinish(state);
553+
if (btree->rumstate->isBuild)
554+
{
555+
MarkBufferDirty(rbuffer);
556+
MarkBufferDirty(stack->buffer);
557+
}
558+
else
559+
GenericXLogFinish(state);
508560

509561
UnlockReleaseBuffer(rbuffer);
562+
if (btree->rumstate->isBuild)
563+
END_CRIT_SECTION();
510564
}
511565
}
512566

rumfast.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,6 @@ rumHeapTupleFastInsert(RumState * rumstate, RumTupleCollector * collector)
256256
/*
257257
* Merge lists
258258
*/
259-
260259
buffer = ReadBuffer(index, metadata->tail);
261260
LockBuffer(buffer, RUM_EXCLUSIVE);
262261
page = GenericXLogRegisterBuffer(state, buffer, 0);

ruminsert.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,16 @@ createPostingTree(RumState * rumstate, OffsetNumber attnum, Relation index,
4949
ItemPointerData prev_iptr = {{0, 0}, 0};
5050
GenericXLogState *state;
5151

52-
state = GenericXLogStart(index);
53-
54-
page = GenericXLogRegisterBuffer(state, buffer, GENERIC_XLOG_FULL_IMAGE);
52+
if (rumstate->isBuild)
53+
{
54+
page = BufferGetPage(buffer);
55+
START_CRIT_SECTION();
56+
}
57+
else
58+
{
59+
state = GenericXLogStart(index);
60+
page = GenericXLogRegisterBuffer(state, buffer, GENERIC_XLOG_FULL_IMAGE);
61+
}
5562
RumInitPage(page, RUM_DATA | RUM_LEAF, BufferGetPageSize(buffer));
5663

5764
blkno = BufferGetBlockNumber(buffer);
@@ -68,10 +75,16 @@ createPostingTree(RumState * rumstate, OffsetNumber attnum, Relation index,
6875
Assert(RumDataPageFreeSpacePre(page, ptr) >= 0);
6976
updateItemIndexes(page, attnum, rumstate);
7077

71-
GenericXLogFinish(state);
78+
if (rumstate->isBuild)
79+
MarkBufferDirty(buffer);
80+
else
81+
GenericXLogFinish(state);
7282

7383
UnlockReleaseBuffer(buffer);
7484

85+
if (rumstate->isBuild)
86+
END_CRIT_SECTION();
87+
7588
return blkno;
7689
}
7790

@@ -592,11 +605,15 @@ rumbuild(Relation heap, Relation index, struct IndexInfo *indexInfo)
592605
/* initialize the root page */
593606
RootBuffer = RumNewBuffer(index);
594607

608+
START_CRIT_SECTION();
595609
RumInitMetabuffer(NULL, MetaBuffer, buildstate.rumstate.isBuild);
610+
MarkBufferDirty(MetaBuffer);
596611
RumInitBuffer(NULL, RootBuffer, RUM_LEAF, buildstate.rumstate.isBuild);
612+
MarkBufferDirty(RootBuffer);
597613

598614
UnlockReleaseBuffer(MetaBuffer);
599615
UnlockReleaseBuffer(RootBuffer);
616+
END_CRIT_SECTION();
600617

601618
/* count the root as first entry page */
602619
buildstate.buildStats.nEntryPages++;

rumutil.c

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "access/reloptions.h"
1717
#include "catalog/pg_collation.h"
1818
#include "catalog/pg_type.h"
19+
#include "miscadmin.h"
1920
#include "storage/indexfsm.h"
2021
#include "storage/lmgr.h"
2122
#include "utils/guc.h"
@@ -483,11 +484,16 @@ RumInitPage(Page page, uint32 f, Size pageSize)
483484
}
484485

485486
void
486-
RumInitBuffer(GenericXLogState *state, Buffer buffer, uint32 flags, bool isBuild)
487+
RumInitBuffer(GenericXLogState *state, Buffer buffer, uint32 flags,
488+
bool isBuild)
487489
{
488490
Page page;
489491

490-
page = GenericXLogRegisterBuffer(state, buffer, GENERIC_XLOG_FULL_IMAGE);
492+
if (isBuild)
493+
page = BufferGetPage(buffer);
494+
else
495+
page = GenericXLogRegisterBuffer(state, buffer,
496+
GENERIC_XLOG_FULL_IMAGE);
491497

492498
RumInitPage(page, flags, BufferGetPageSize(buffer));
493499
}
@@ -499,8 +505,11 @@ RumInitMetabuffer(GenericXLogState *state, Buffer metaBuffer, bool isBuild)
499505
RumMetaPageData *metadata;
500506

501507
/* Initialize contents of meta page */
502-
metaPage = GenericXLogRegisterBuffer(state, metaBuffer,
503-
GENERIC_XLOG_FULL_IMAGE);
508+
if (isBuild)
509+
metaPage = BufferGetPage(metaBuffer);
510+
else
511+
metaPage = GenericXLogRegisterBuffer(state, metaBuffer,
512+
GENERIC_XLOG_FULL_IMAGE);
504513

505514
RumInitPage(metaPage, RUM_META, BufferGetPageSize(metaBuffer));
506515
metadata = RumPageGetMeta(metaPage);
@@ -844,26 +853,39 @@ rumGetStats(Relation index, GinStatsData *stats)
844853
void
845854
rumUpdateStats(Relation index, const GinStatsData *stats, bool isBuild)
846855
{
847-
Buffer metabuffer;
856+
Buffer metaBuffer;
848857
Page metapage;
849858
RumMetaPageData *metadata;
850859
GenericXLogState *state;
851860

852-
state = GenericXLogStart(index);
853-
854-
metabuffer = ReadBuffer(index, RUM_METAPAGE_BLKNO);
855-
LockBuffer(metabuffer, RUM_EXCLUSIVE);
856-
metapage = GenericXLogRegisterBuffer(state, metabuffer, 0);
861+
metaBuffer = ReadBuffer(index, RUM_METAPAGE_BLKNO);
862+
LockBuffer(metaBuffer, RUM_EXCLUSIVE);
863+
if (isBuild)
864+
{
865+
metapage = BufferGetPage(metaBuffer);
866+
START_CRIT_SECTION();
867+
}
868+
else
869+
{
870+
state = GenericXLogStart(index);
871+
metapage = GenericXLogRegisterBuffer(state, metaBuffer, 0);
872+
}
857873
metadata = RumPageGetMeta(metapage);
858874

859875
metadata->nTotalPages = stats->nTotalPages;
860876
metadata->nEntryPages = stats->nEntryPages;
861877
metadata->nDataPages = stats->nDataPages;
862878
metadata->nEntries = stats->nEntries;
863879

864-
GenericXLogFinish(state);
880+
if (isBuild)
881+
MarkBufferDirty(metaBuffer);
882+
else
883+
GenericXLogFinish(state);
865884

866-
UnlockReleaseBuffer(metabuffer);
885+
UnlockReleaseBuffer(metaBuffer);
886+
887+
if (isBuild)
888+
END_CRIT_SECTION();
867889
}
868890

869891
Datum

0 commit comments

Comments
 (0)