Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit22f519c

Browse files
committed
Fix bug introduced by microvacuum for GiST
Commit013ebc0 introduces microvacuum forGiST, deletetion of tuple marked LP_DEAD uses IndexPageMultiDelete whilerecovery code uses IndexPageTupleDelete in loop. This causes a differencein offset numbers of tuples to delete. Patch introduces usage ofIndexPageMultiDelete in GiST except gistplacetopage() where only one tuple isdeleted at once. That also slightly improve performance, becauseIndexPageMultiDelete is more effective.Patch changes WAL format, so bump wal page magic.Bug report from Jeff JanesDiagnostic and patch by Anastasia Lubennikova and me
1 parent7aea8e4 commit22f519c

File tree

4 files changed

+11
-11
lines changed

4 files changed

+11
-11
lines changed

‎src/backend/access/gist/gist.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,11 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate,
466466
*/
467467
START_CRIT_SECTION();
468468

469+
/*
470+
* While we delete only one tuple at once we could mix calls
471+
* PageIndexTupleDelete() here and PageIndexMultiDelete() in
472+
* gistRedoPageUpdateRecord()
473+
*/
469474
if (OffsetNumberIsValid(oldoffnum))
470475
PageIndexTupleDelete(page,oldoffnum);
471476
gistfillbuffer(page,itup,ntup,InvalidOffsetNumber);

‎src/backend/access/gist/gistvacuum.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,23 +208,20 @@ gistbulkdelete(PG_FUNCTION_ARGS)
208208
idxtuple= (IndexTuple)PageGetItem(page,iid);
209209

210210
if (callback(&(idxtuple->t_tid),callback_state))
211-
{
212-
todelete[ntodelete]=i-ntodelete;
213-
ntodelete++;
214-
stats->tuples_removed+=1;
215-
}
211+
todelete[ntodelete++]=i;
216212
else
217213
stats->num_index_tuples+=1;
218214
}
219215

216+
stats->tuples_removed+=ntodelete;
217+
220218
if (ntodelete)
221219
{
222220
START_CRIT_SECTION();
223221

224222
MarkBufferDirty(buffer);
225223

226-
for (i=0;i<ntodelete;i++)
227-
PageIndexTupleDelete(page,todelete[i]);
224+
PageIndexMultiDelete(page,todelete,ntodelete);
228225
GistMarkTuplesDeleted(page);
229226

230227
if (RelationNeedsWAL(rel))

‎src/backend/access/gist/gistxlog.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,11 @@ gistRedoPageUpdateRecord(XLogReaderState *record)
8383
/* Delete old tuples */
8484
if (xldata->ntodelete>0)
8585
{
86-
inti;
8786
OffsetNumber*todelete= (OffsetNumber*)data;
8887

8988
data+=sizeof(OffsetNumber)*xldata->ntodelete;
9089

91-
for (i=0;i<xldata->ntodelete;i++)
92-
PageIndexTupleDelete(page,todelete[i]);
90+
PageIndexMultiDelete(page,todelete,xldata->ntodelete);
9391
if (GistPageIsLeaf(page))
9492
GistMarkTuplesDeleted(page);
9593
}

‎src/include/access/xlog_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
/*
3232
* Each page of XLOG file has a header like this:
3333
*/
34-
#defineXLOG_PAGE_MAGIC0xD085/* can be used as WAL version indicator */
34+
#defineXLOG_PAGE_MAGIC0xD086/* can be used as WAL version indicator */
3535

3636
typedefstructXLogPageHeaderData
3737
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp