mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-09 08:10:09 +08:00
Flag index metapages as standard-format in xlog.c calls.
btree, hash, and bloom indexes all set up their metapages in standard format (that is, with pd_lower and pd_upper correctly delimiting the unused area); but they mostly didn't inform the xlog routines of this. When calling log_newpage[_buffer], this is bad because it loses the opportunity to compress unused data out of the WAL record. When calling XLogRegisterBuffer, it's not such a performance problem because all of these call sites also use REGBUF_WILL_INIT, preventing an FPI image from being written. But it's still a good idea to provide the flag when relevant, because that aids WAL consistency checking. This completes the project of getting all the in-core index AMs to handle their metapage WAL operations similarly. Amit Kapila, reviewed by Michael Paquier Discussion: https://postgr.es/m/0d273805-0e9e-ec1a-cb84-d4da400b8f85@lab.ntt.co.jp
This commit is contained in:
parent
1b890562b8
commit
4c11d2c559
@ -175,7 +175,7 @@ blbuildempty(Relation index)
|
||||
smgrwrite(index->rd_smgr, INIT_FORKNUM, BLOOM_METAPAGE_BLKNO,
|
||||
(char *) metapage, true);
|
||||
log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM,
|
||||
BLOOM_METAPAGE_BLKNO, metapage, false);
|
||||
BLOOM_METAPAGE_BLKNO, metapage, true);
|
||||
|
||||
/*
|
||||
* An immediate sync is required even if we xlog'd the page, because the
|
||||
|
@ -403,7 +403,7 @@ _hash_init(Relation rel, double num_tuples, ForkNumber forkNum)
|
||||
|
||||
XLogBeginInsert();
|
||||
XLogRegisterData((char *) &xlrec, SizeOfHashInitMetaPage);
|
||||
XLogRegisterBuffer(0, metabuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(0, metabuf, REGBUF_WILL_INIT | REGBUF_STANDARD);
|
||||
|
||||
recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_INIT_META_PAGE);
|
||||
|
||||
@ -592,8 +592,9 @@ _hash_init_metabuffer(Buffer buf, double num_tuples, RegProcedure procid,
|
||||
metap->hashm_firstfree = 0;
|
||||
|
||||
/*
|
||||
* Set pd_lower just past the end of the metadata. This is to log full
|
||||
* page image of metapage in xloginsert.c.
|
||||
* Set pd_lower just past the end of the metadata. This is essential,
|
||||
* because without doing so, metadata will be lost if xlog.c compresses
|
||||
* the page.
|
||||
*/
|
||||
((PageHeader) page)->pd_lower =
|
||||
((char *) metap + sizeof(HashMetaPageData)) - (char *) page;
|
||||
|
@ -898,7 +898,7 @@ _bt_insertonpg(Relation rel,
|
||||
xlmeta.fastroot = metad->btm_fastroot;
|
||||
xlmeta.fastlevel = metad->btm_fastlevel;
|
||||
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT | REGBUF_STANDARD);
|
||||
XLogRegisterBufData(2, (char *) &xlmeta, sizeof(xl_btree_metadata));
|
||||
|
||||
xlinfo = XLOG_BTREE_INSERT_META;
|
||||
@ -2032,7 +2032,7 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
|
||||
|
||||
XLogRegisterBuffer(0, rootbuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(1, lbuf, REGBUF_STANDARD);
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT | REGBUF_STANDARD);
|
||||
|
||||
md.root = rootblknum;
|
||||
md.level = metad->btm_level;
|
||||
|
@ -65,8 +65,9 @@ _bt_initmetapage(Page page, BlockNumber rootbknum, uint32 level)
|
||||
metaopaque->btpo_flags = BTP_META;
|
||||
|
||||
/*
|
||||
* Set pd_lower just past the end of the metadata. This is not essential
|
||||
* but it makes the page look compressible to xlog.c.
|
||||
* Set pd_lower just past the end of the metadata. This is essential,
|
||||
* because without doing so, metadata will be lost if xlog.c compresses
|
||||
* the page.
|
||||
*/
|
||||
((PageHeader) page)->pd_lower =
|
||||
((char *) metad + sizeof(BTMetaPageData)) - (char *) page;
|
||||
@ -241,7 +242,7 @@ _bt_getroot(Relation rel, int access)
|
||||
|
||||
XLogBeginInsert();
|
||||
XLogRegisterBuffer(0, rootbuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(2, metabuf, REGBUF_WILL_INIT | REGBUF_STANDARD);
|
||||
|
||||
md.root = rootblkno;
|
||||
md.level = 0;
|
||||
@ -1827,7 +1828,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty)
|
||||
|
||||
if (BufferIsValid(metabuf))
|
||||
{
|
||||
XLogRegisterBuffer(4, metabuf, REGBUF_WILL_INIT);
|
||||
XLogRegisterBuffer(4, metabuf, REGBUF_WILL_INIT | REGBUF_STANDARD);
|
||||
|
||||
xlmeta.root = metad->btm_root;
|
||||
xlmeta.level = metad->btm_level;
|
||||
|
@ -298,7 +298,7 @@ btbuildempty(Relation index)
|
||||
smgrwrite(index->rd_smgr, INIT_FORKNUM, BTREE_METAPAGE,
|
||||
(char *) metapage, true);
|
||||
log_newpage(&index->rd_smgr->smgr_rnode.node, INIT_FORKNUM,
|
||||
BTREE_METAPAGE, metapage, false);
|
||||
BTREE_METAPAGE, metapage, true);
|
||||
|
||||
/*
|
||||
* An immediate sync is required even if we xlog'd the page, because the
|
||||
|
@ -107,8 +107,9 @@ _bt_restore_meta(XLogReaderState *record, uint8 block_id)
|
||||
pageop->btpo_flags = BTP_META;
|
||||
|
||||
/*
|
||||
* Set pd_lower just past the end of the metadata. This is not essential
|
||||
* but it makes the page look compressible to xlog.c.
|
||||
* Set pd_lower just past the end of the metadata. This is essential,
|
||||
* because without doing so, metadata will be lost if xlog.c compresses
|
||||
* the page.
|
||||
*/
|
||||
((PageHeader) metapg)->pd_lower =
|
||||
((char *) md + sizeof(BTMetaPageData)) - (char *) metapg;
|
||||
|
Loading…
Reference in New Issue
Block a user