]> granicus.if.org Git - postgresql/commitdiff
Flag index metapages as standard-format in xlog.c calls.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Nov 2017 20:31:32 +0000 (16:31 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Nov 2017 20:31:32 +0000 (16:31 -0400)
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

contrib/bloom/blinsert.c
src/backend/access/hash/hashpage.c
src/backend/access/nbtree/nbtinsert.c
src/backend/access/nbtree/nbtpage.c
src/backend/access/nbtree/nbtree.c
src/backend/access/nbtree/nbtxlog.c

index 0d506e3c1ad6afa79133e02804aabfe1fa45c6b9..1fcb2815086f8e8fc06d8db9ccd60feea99ae16c 100644 (file)
@@ -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
index f279dcea1de786f527e28aa1e2eb06112c8b7e59..4b14f88af944b0097942ebfec5ae6a4619795d77 100644 (file)
@@ -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;
index bf963fcdef22252f79b10ae6f1280ce42ef630a5..5cbaba1b7d3162511be6510d05163a68581d3682 100644 (file)
@@ -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;
index 10697e9e23bfb571934e10e5174d058bf023a838..c77434904e2b2a7703c5da8d174700ed1baffce7 100644 (file)
@@ -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;
index 3dbafdd6fc4f7d6eef0912e33f102432514e82e2..399e6a1ae58306dbbb30c1b5ca0d35c511645cf1 100644 (file)
@@ -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
index 82337f8ef288a4d3d043d6d11acc12c4bc765ddc..7250b4f0b83ad73bb22c81b76688c88f53da7e13 100644 (file)
@@ -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;