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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy