diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 4edc5a75f2836c14f79d78155162646bfb5d5cd3..53bccf6d185b37c44a2fdd00d0b946e1817d1e95 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -466,6 +466,11 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, */ START_CRIT_SECTION(); + /* + * While we delete only one tuple at once we could mix calls + * PageIndexTupleDelete() here and PageIndexMultiDelete() in + * gistRedoPageUpdateRecord() + */ if (OffsetNumberIsValid(oldoffnum)) PageIndexTupleDelete(page, oldoffnum); gistfillbuffer(page, itup, ntup, InvalidOffsetNumber); diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 2337dbd7f9d71e6fd51bdf94643dae67c2e1ea8d..a0b0eebed3dbf704cc0dcfe23c42542a96ada245 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -208,23 +208,20 @@ gistbulkdelete(PG_FUNCTION_ARGS) idxtuple = (IndexTuple) PageGetItem(page, iid); if (callback(&(idxtuple->t_tid), callback_state)) - { - todelete[ntodelete] = i - ntodelete; - ntodelete++; - stats->tuples_removed += 1; - } + todelete[ntodelete++] = i; else stats->num_index_tuples += 1; } + stats->tuples_removed += ntodelete; + if (ntodelete) { START_CRIT_SECTION(); MarkBufferDirty(buffer); - for (i = 0; i < ntodelete; i++) - PageIndexTupleDelete(page, todelete[i]); + PageIndexMultiDelete(page, todelete, ntodelete); GistMarkTuplesDeleted(page); if (RelationNeedsWAL(rel)) diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index fbdbb3c51f2e7fc7e40c918bffe063537836233e..c63cc8190c4d3722eb9451076d546b1886512c21 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -83,13 +83,11 @@ gistRedoPageUpdateRecord(XLogReaderState *record) /* Delete old tuples */ if (xldata->ntodelete > 0) { - int i; OffsetNumber *todelete = (OffsetNumber *) data; data += sizeof(OffsetNumber) * xldata->ntodelete; - for (i = 0; i < xldata->ntodelete; i++) - PageIndexTupleDelete(page, todelete[i]); + PageIndexMultiDelete(page, todelete, xldata->ntodelete); if (GistPageIsLeaf(page)) GistMarkTuplesDeleted(page); } diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index 5ebaa5f69c6aa42fdd78e923f21be8eaef69d5d1..590bf1729ae358fe1b42c416112e7778d490124c 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD085 /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD086 /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData {