Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 132c495

Browse files
committed
spgist ptrack with xlog
1 parent 31e7971 commit 132c495

File tree

4 files changed

+109
-3
lines changed

4 files changed

+109
-3
lines changed

src/backend/access/spgist/spgdoinsert.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "access/genam.h"
1919
#include "access/spgist_private.h"
2020
#include "access/xloginsert.h"
21+
#include "access/ptrack.h"
2122
#include "miscadmin.h"
2223
#include "storage/bufmgr.h"
2324
#include "utils/rel.h"
@@ -213,6 +214,7 @@ addLeafTuple(Relation index, SpGistState *state, SpGistLeafTuple leafTuple,
213214
xlrec.offnumParent = InvalidOffsetNumber;
214215
xlrec.nodeI = 0;
215216

217+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
216218
START_CRIT_SECTION();
217219

218220
if (current->offnum == InvalidOffsetNumber ||
@@ -457,6 +459,9 @@ moveLeafs(Relation index, SpGistState *state,
457459

458460
leafdata = leafptr = palloc(size);
459461

462+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
463+
ptrack_add_block(index, BufferGetBlockNumber(nbuf));
464+
ptrack_add_block(index, BufferGetBlockNumber(parent->buffer));
460465
START_CRIT_SECTION();
461466

462467
/* copy all the old tuples to new page, unless they're dead */
@@ -1109,6 +1114,13 @@ doPickSplit(Relation index, SpGistState *state,
11091114
leafdata = leafptr = (char *) palloc(totalLeafSizes);
11101115

11111116
/* Here we begin making the changes to the target pages */
1117+
if (newLeafBuffer != InvalidBuffer)
1118+
ptrack_add_block(index, BufferGetBlockNumber(newLeafBuffer));
1119+
if (saveCurrent.buffer != InvalidBuffer)
1120+
ptrack_add_block(index, BufferGetBlockNumber(saveCurrent.buffer));
1121+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
1122+
if (parent->buffer != InvalidBuffer)
1123+
ptrack_add_block(index, BufferGetBlockNumber(parent->buffer));
11121124
START_CRIT_SECTION();
11131125

11141126
/*
@@ -1519,6 +1531,7 @@ spgAddNodeAction(Relation index, SpGistState *state,
15191531
/*
15201532
* We can replace the inner tuple by new version in-place
15211533
*/
1534+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
15221535
START_CRIT_SECTION();
15231536

15241537
PageIndexTupleDelete(current->page, current->offnum);
@@ -1602,6 +1615,9 @@ spgAddNodeAction(Relation index, SpGistState *state,
16021615
else
16031616
xlrec.parentBlk = 2;
16041617

1618+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
1619+
ptrack_add_block(index, BufferGetBlockNumber(saveCurrent.buffer));
1620+
ptrack_add_block(index, BufferGetBlockNumber(parent->buffer));
16051621
START_CRIT_SECTION();
16061622

16071623
/* insert new ... */
@@ -1764,6 +1780,9 @@ spgSplitNodeAction(Relation index, SpGistState *state,
17641780
&xlrec.newPage);
17651781
}
17661782

1783+
if (newBuffer != InvalidBuffer)
1784+
ptrack_add_block(index, BufferGetBlockNumber(newBuffer));
1785+
ptrack_add_block(index, BufferGetBlockNumber(current->buffer));
17671786
START_CRIT_SECTION();
17681787

17691788
/*

src/backend/access/spgist/spginsert.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "access/xlog.h"
2222
#include "access/xloginsert.h"
2323
#include "access/generic_xlog.h"
24+
#include "access/ptrack.h"
2425
#include "catalog/index.h"
2526
#include "miscadmin.h"
2627
#include "storage/bufmgr.h"
@@ -91,6 +92,9 @@ spgbuild(Relation heap, Relation index, IndexInfo *indexInfo)
9192
Assert(BufferGetBlockNumber(rootbuffer) == SPGIST_ROOT_BLKNO);
9293
Assert(BufferGetBlockNumber(nullbuffer) == SPGIST_NULL_BLKNO);
9394

95+
ptrack_add_block(index, BufferGetBlockNumber(metabuffer));
96+
ptrack_add_block(index, BufferGetBlockNumber(rootbuffer));
97+
ptrack_add_block(index, BufferGetBlockNumber(nullbuffer));
9498
START_CRIT_SECTION();
9599

96100
SpGistInitMetapage(BufferGetPage(metabuffer));

src/backend/access/spgist/spgvacuum.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "access/spgist_private.h"
2020
#include "access/transam.h"
2121
#include "access/xloginsert.h"
22+
#include "access/ptrack.h"
2223
#include "catalog/storage_xlog.h"
2324
#include "commands/vacuum.h"
2425
#include "miscadmin.h"
@@ -323,6 +324,7 @@ vacuumLeafPage(spgBulkDeleteState *bds, Relation index, Buffer buffer,
323324
elog(ERROR, "inconsistent counts of deletable tuples");
324325

325326
/* Do the updates */
327+
ptrack_add_block(index, BufferGetBlockNumber(buffer));
326328
START_CRIT_SECTION();
327329

328330
spgPageIndexMultiDelete(&bds->spgstate, page,
@@ -447,6 +449,7 @@ vacuumLeafRoot(spgBulkDeleteState *bds, Relation index, Buffer buffer)
447449
return; /* nothing more to do */
448450

449451
/* Do the update */
452+
ptrack_add_block(index, BufferGetBlockNumber(buffer));
450453
START_CRIT_SECTION();
451454

452455
/* The tuple numbers are in order, so we can use PageIndexMultiDelete */
@@ -504,6 +507,7 @@ vacuumRedirectAndPlaceholder(Relation index, Buffer buffer)
504507
xlrec.nToPlaceholder = 0;
505508
xlrec.newestRedirectXid = InvalidTransactionId;
506509

510+
ptrack_add_block(index, BufferGetBlockNumber(buffer));
507511
START_CRIT_SECTION();
508512

509513
/*

src/backend/access/spgist/spgxlog.c

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "access/transam.h"
1919
#include "access/xlog.h"
2020
#include "access/xlogutils.h"
21+
#include "access/ptrack.h"
2122
#include "storage/standby.h"
2223
#include "utils/memutils.h"
2324

@@ -76,6 +77,15 @@ spgRedoCreateIndex(XLogReaderState *record)
7677
XLogRecPtr lsn = record->EndRecPtr;
7778
Buffer buffer;
7879
Page page;
80+
RelFileNode rnode;
81+
BlockNumber blkno;
82+
83+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
84+
ptrack_add_block_redo(rnode, blkno);
85+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
86+
ptrack_add_block_redo(rnode, blkno);
87+
XLogRecGetBlockTag(record, 2, &rnode, NULL, &blkno);
88+
ptrack_add_block_redo(rnode, blkno);
7989

8090
buffer = XLogInitBufferForRedo(record, 0);
8191
Assert(BufferGetBlockNumber(buffer) == SPGIST_METAPAGE_BLKNO);
@@ -113,6 +123,16 @@ spgRedoAddLeaf(XLogReaderState *record)
113123
Buffer buffer;
114124
Page page;
115125
XLogRedoAction action;
126+
RelFileNode rnode;
127+
BlockNumber blkno;
128+
129+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
130+
ptrack_add_block_redo(rnode, blkno);
131+
if (xldata->offnumParent != InvalidOffsetNumber)
132+
{
133+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
134+
ptrack_add_block_redo(rnode, blkno);
135+
}
116136

117137
ptr += sizeof(spgxlogAddLeaf);
118138
leafTuple = ptr;
@@ -213,8 +233,15 @@ spgRedoMoveLeafs(XLogReaderState *record)
213233
Page page;
214234
XLogRedoAction action;
215235
BlockNumber blknoDst;
236+
RelFileNode rnode;
237+
BlockNumber blkno;
216238

217-
XLogRecGetBlockTag(record, 1, NULL, NULL, &blknoDst);
239+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blknoDst);
240+
ptrack_add_block_redo(rnode, blknoDst);
241+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
242+
ptrack_add_block_redo(rnode, blkno);
243+
XLogRecGetBlockTag(record, 2, &rnode, NULL, &blkno);
244+
ptrack_add_block_redo(rnode, blkno);
218245

219246
fillFakeState(&state, xldata->stateSrc);
220247

@@ -324,6 +351,21 @@ spgRedoAddNode(XLogReaderState *record)
324351
Buffer buffer;
325352
Page page;
326353
XLogRedoAction action;
354+
RelFileNode rnode;
355+
BlockNumber blkno;
356+
357+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
358+
ptrack_add_block_redo(rnode, blkno);
359+
if(XLogRecHasBlockRef(record, 1))
360+
{
361+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
362+
ptrack_add_block_redo(rnode, blkno);
363+
}
364+
if (xldata->parentBlk == 2)
365+
{
366+
XLogRecGetBlockTag(record, 2, &rnode, NULL, &blkno);
367+
ptrack_add_block_redo(rnode, blkno);
368+
}
327369

328370
ptr += sizeof(spgxlogAddNode);
329371
innerTuple = ptr;
@@ -492,6 +534,13 @@ spgRedoSplitTuple(XLogReaderState *record)
492534
Buffer buffer;
493535
Page page;
494536
XLogRedoAction action;
537+
RelFileNode rnode;
538+
BlockNumber blkno;
539+
540+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
541+
ptrack_add_block_redo(rnode, blkno);
542+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
543+
ptrack_add_block_redo(rnode, blkno);
495544

496545
ptr += sizeof(spgxlogSplitTuple);
497546
prefixTuple = ptr;
@@ -578,8 +627,23 @@ spgRedoPickSplit(XLogReaderState *record)
578627
int i;
579628
BlockNumber blknoInner;
580629
XLogRedoAction action;
581-
582-
XLogRecGetBlockTag(record, 2, NULL, NULL, &blknoInner);
630+
RelFileNode rnode;
631+
BlockNumber blkno;
632+
633+
XLogRecGetBlockTag(record, 2, &rnode, NULL, &blknoInner);
634+
ptrack_add_block_redo(rnode, blknoInner);
635+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
636+
ptrack_add_block_redo(rnode, blkno);
637+
if (XLogRecHasBlockRef(record, 1))
638+
{
639+
XLogRecGetBlockTag(record, 1, &rnode, NULL, &blkno);
640+
ptrack_add_block_redo(rnode, blkno);
641+
}
642+
if (XLogRecHasBlockRef(record, 3))
643+
{
644+
XLogRecGetBlockTag(record, 3, &rnode, NULL, &blkno);
645+
ptrack_add_block_redo(rnode, blkno);
646+
}
583647

584648
fillFakeState(&state, xldata->stateSrc);
585649

@@ -795,6 +859,11 @@ spgRedoVacuumLeaf(XLogReaderState *record)
795859
Buffer buffer;
796860
Page page;
797861
int i;
862+
RelFileNode rnode;
863+
BlockNumber blkno;
864+
865+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
866+
ptrack_add_block_redo(rnode, blkno);
798867

799868
fillFakeState(&state, xldata->stateSrc);
800869

@@ -871,6 +940,11 @@ spgRedoVacuumRoot(XLogReaderState *record)
871940
OffsetNumber *toDelete;
872941
Buffer buffer;
873942
Page page;
943+
RelFileNode rnode;
944+
BlockNumber blkno;
945+
946+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
947+
ptrack_add_block_redo(rnode, blkno);
874948

875949
toDelete = xldata->offsets;
876950

@@ -896,6 +970,11 @@ spgRedoVacuumRedirect(XLogReaderState *record)
896970
spgxlogVacuumRedirect *xldata = (spgxlogVacuumRedirect *) ptr;
897971
OffsetNumber *itemToPlaceholder;
898972
Buffer buffer;
973+
RelFileNode rnode;
974+
BlockNumber blkno;
975+
976+
XLogRecGetBlockTag(record, 0, &rnode, NULL, &blkno);
977+
ptrack_add_block_redo(rnode, blkno);
899978

900979
itemToPlaceholder = xldata->offsets;
901980

0 commit comments

Comments
 (0)