aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/nbtree/nbtpage.c28
-rw-r--r--src/backend/access/nbtree/nbtree.c11
-rw-r--r--src/backend/access/nbtree/nbtxlog.c4
-rw-r--r--src/include/access/nbtree.h3
4 files changed, 31 insertions, 15 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 42b2cd40b89..29a9df027b8 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -715,7 +715,7 @@ _bt_page_recyclable(Page page)
}
/*
- * Delete item(s) from a btree page.
+ * Delete item(s) from a btree page during VACUUM.
*
* This must only be used for deleting leaf items. Deleting an item on a
* non-leaf page has to be done as part of an atomic action that includes
@@ -736,7 +736,8 @@ _bt_page_recyclable(Page page)
*/
void
_bt_delitems_vacuum(Relation rel, Buffer buf,
- OffsetNumber *itemnos, int nitems, BlockNumber lastBlockVacuumed)
+ OffsetNumber *itemnos, int nitems,
+ BlockNumber lastBlockVacuumed)
{
Page page = BufferGetPage(buf);
BTPageOpaque opaque;
@@ -771,7 +772,6 @@ _bt_delitems_vacuum(Relation rel, Buffer buf,
{
XLogRecPtr recptr;
XLogRecData rdata[2];
-
xl_btree_vacuum xlrec_vacuum;
xlrec_vacuum.node = rel->rd_node;
@@ -811,13 +811,27 @@ _bt_delitems_vacuum(Relation rel, Buffer buf,
END_CRIT_SECTION();
}
+/*
+ * Delete item(s) from a btree page during single-page cleanup.
+ *
+ * As above, must only be used on leaf pages.
+ *
+ * This routine assumes that the caller has pinned and locked the buffer.
+ * Also, the given itemnos *must* appear in increasing order in the array.
+ *
+ * This is nearly the same as _bt_delitems_vacuum as far as what it does to
+ * the page, but the WAL logging considerations are quite different. See
+ * comments for _bt_delitems_vacuum.
+ */
void
_bt_delitems_delete(Relation rel, Buffer buf,
- OffsetNumber *itemnos, int nitems, Relation heapRel)
+ OffsetNumber *itemnos, int nitems,
+ Relation heapRel)
{
Page page = BufferGetPage(buf);
BTPageOpaque opaque;
+ /* Shouldn't be called unless there's something to do */
Assert(nitems > 0);
/* No ereport(ERROR) until changes are logged */
@@ -849,7 +863,6 @@ _bt_delitems_delete(Relation rel, Buffer buf,
{
XLogRecPtr recptr;
XLogRecData rdata[3];
-
xl_btree_delete xlrec_delete;
xlrec_delete.node = rel->rd_node;
@@ -863,8 +876,9 @@ _bt_delitems_delete(Relation rel, Buffer buf,
rdata[0].next = &(rdata[1]);
/*
- * We need the target-offsets array whether or not we store the to
- * allow us to find the latestRemovedXid on a standby server.
+ * We need the target-offsets array whether or not we store the whole
+ * buffer, to allow us to find the latestRemovedXid on a standby
+ * server.
*/
rdata[1].data = (char *) itemnos;
rdata[1].len = nitems * sizeof(OffsetNumber);
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 76277384373..184fc3bb79b 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -1004,14 +1004,15 @@ restart:
}
/*
- * Apply any needed deletes. We issue just one _bt_delitems() call
- * per page, so as to minimize WAL traffic.
+ * Apply any needed deletes. We issue just one _bt_delitems_vacuum()
+ * call per page, so as to minimize WAL traffic.
*/
if (ndeletable > 0)
{
BlockNumber lastBlockVacuumed = BufferGetBlockNumber(buf);
- _bt_delitems_vacuum(rel, buf, deletable, ndeletable, vstate->lastBlockVacuumed);
+ _bt_delitems_vacuum(rel, buf, deletable, ndeletable,
+ vstate->lastBlockVacuumed);
/*
* Keep track of the block number of the lastBlockVacuumed, so we
@@ -1031,8 +1032,8 @@ restart:
/*
* If the page has been split during this vacuum cycle, it seems
* worth expending a write to clear btpo_cycleid even if we don't
- * have any deletions to do. (If we do, _bt_delitems takes care
- * of this.) This ensures we won't process the page again.
+ * have any deletions to do. (If we do, _bt_delitems_vacuum takes
+ * care of this.) This ensures we won't process the page again.
*
* We treat this like a hint-bit update because there's no need to
* WAL-log it.
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index 0f5c113492d..3b351a8b964 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -539,7 +539,7 @@ btree_xlog_vacuum(XLogRecPtr lsn, XLogRecord *record)
/*
* Mark the page as not containing any LP_DEAD items --- see comments in
- * _bt_delitems().
+ * _bt_delitems_vacuum().
*/
opaque = (BTPageOpaque) PageGetSpecialPointer(page);
opaque->btpo_flags &= ~BTP_HAS_GARBAGE;
@@ -720,7 +720,7 @@ btree_xlog_delete(XLogRecPtr lsn, XLogRecord *record)
/*
* Mark the page as not containing any LP_DEAD items --- see comments in
- * _bt_delitems().
+ * _bt_delitems_delete().
*/
opaque = (BTPageOpaque) PageGetSpecialPointer(page);
opaque->btpo_flags &= ~BTP_HAS_GARBAGE;
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index 041733ce309..cae51a384d4 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -635,7 +635,8 @@ extern bool _bt_page_recyclable(Page page);
extern void _bt_delitems_delete(Relation rel, Buffer buf,
OffsetNumber *itemnos, int nitems, Relation heapRel);
extern void _bt_delitems_vacuum(Relation rel, Buffer buf,
- OffsetNumber *itemnos, int nitems, BlockNumber lastBlockVacuumed);
+ OffsetNumber *itemnos, int nitems,
+ BlockNumber lastBlockVacuumed);
extern int _bt_pagedel(Relation rel, Buffer buf, BTStack stack);
/*