mirror of
https://github.com/postgres/postgres.git
synced 2025-10-21 02:52:47 +03:00
Remove unneeded "pin scan" nbtree VACUUM code.
The REDO routine for nbtree's xl_btree_vacuum record type hasn't performed a "pin scan" since commit3e4b7d87
went in, so clearly there isn't any point in VACUUM WAL-logging information that won't actually be used. Finish off the work of commit3e4b7d87
(and the closely related preceding commit687f2cd7
) by removing the code that generates this unused information. Also remove the REDO routine code disabled by commit3e4b7d87
. Replace the unneeded lastBlockVacuumed field in xl_btree_vacuum with a new "ndeleted" field. The new field isn't actually needed right now, since we could continue to infer the array length from the overall record length. However, an upcoming patch to add deduplication to nbtree needs to add an "items updated" field to xl_btree_vacuum, so we might as well start being explicit about the number of items now. (Besides, it doesn't seem like a good idea to leave the xl_btree_vacuum struct without any fields; the C standard says that that's undefined.) nbtree VACUUM no longer forces writing a WAL record for the last block in the index. Writing out a WAL record with no items for the final block was supposed to force processing of a lastBlockVacuumed field by a pin scan. Bump XLOG_PAGE_MAGIC because xl_btree_vacuum changed. Discussion: https://postgr.es/m/CAH2-WzmY_mT7UnTzFB5LBQDBkKpdV5UxP3B5bLb7uP%3D%3D6UQJRQ%40mail.gmail.com
This commit is contained in:
@@ -779,8 +779,7 @@ 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 *deletable, int ndeletable);
|
||||
extern int _bt_pagedel(Relation rel, Buffer buf);
|
||||
|
||||
/*
|
||||
|
@@ -134,7 +134,11 @@ typedef struct xl_btree_delete
|
||||
#define SizeOfBtreeDelete (offsetof(xl_btree_delete, nitems) + sizeof(int))
|
||||
|
||||
/*
|
||||
* This is what we need to know about page reuse within btree.
|
||||
* This is what we need to know about page reuse within btree. This record
|
||||
* only exists to generate a conflict point for Hot Standby.
|
||||
*
|
||||
* Note that we must include a RelFileNode in the record because we don't
|
||||
* actually register the buffer with the record.
|
||||
*/
|
||||
typedef struct xl_btree_reuse_page
|
||||
{
|
||||
@@ -150,32 +154,17 @@ typedef struct xl_btree_reuse_page
|
||||
* The WAL record can represent deletion of any number of index tuples on a
|
||||
* single index page when executed by VACUUM.
|
||||
*
|
||||
* For MVCC scans, lastBlockVacuumed will be set to InvalidBlockNumber.
|
||||
* For a non-MVCC index scans there is an additional correctness requirement
|
||||
* for applying these changes during recovery, which is that we must do one
|
||||
* of these two things for every block in the index:
|
||||
* * lock the block for cleanup and apply any required changes
|
||||
* * EnsureBlockUnpinned()
|
||||
* The purpose of this is to ensure that no index scans started before we
|
||||
* finish scanning the index are still running by the time we begin to remove
|
||||
* heap tuples.
|
||||
*
|
||||
* Any changes to any one block are registered on just one WAL record. All
|
||||
* blocks that we need to run EnsureBlockUnpinned() are listed as a block range
|
||||
* starting from the last block vacuumed through until this one. Individual
|
||||
* block numbers aren't given.
|
||||
*
|
||||
* Note that the *last* WAL record in any vacuum of an index is allowed to
|
||||
* have a zero length array of offsets. Earlier records must have at least one.
|
||||
* Note that the WAL record in any vacuum of an index must have at least one
|
||||
* item to delete.
|
||||
*/
|
||||
typedef struct xl_btree_vacuum
|
||||
{
|
||||
BlockNumber lastBlockVacuumed;
|
||||
uint32 ndeleted;
|
||||
|
||||
/* TARGET OFFSET NUMBERS FOLLOW */
|
||||
/* DELETED TARGET OFFSET NUMBERS FOLLOW */
|
||||
} xl_btree_vacuum;
|
||||
|
||||
#define SizeOfBtreeVacuum (offsetof(xl_btree_vacuum, lastBlockVacuumed) + sizeof(BlockNumber))
|
||||
#define SizeOfBtreeVacuum (offsetof(xl_btree_vacuum, ndeleted) + sizeof(uint32))
|
||||
|
||||
/*
|
||||
* This is what we need to know about marking an empty branch for deletion.
|
||||
|
@@ -31,7 +31,7 @@
|
||||
/*
|
||||
* Each page of XLOG file has a header like this:
|
||||
*/
|
||||
#define XLOG_PAGE_MAGIC 0xD102 /* can be used as WAL version indicator */
|
||||
#define XLOG_PAGE_MAGIC 0xD103 /* can be used as WAL version indicator */
|
||||
|
||||
typedef struct XLogPageHeaderData
|
||||
{
|
||||
|
Reference in New Issue
Block a user