Move _bt_upgrademetapage() into critical section.
authorTeodor Sigaev <teodor@sigaev.ru>
Wed, 30 May 2018 16:45:39 +0000 (19:45 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Wed, 30 May 2018 16:45:39 +0000 (19:45 +0300)
Any changes on page should be done in critical section, so move
_bt_upgrademetapage into critical section. Improve comment. Found by Amit
Kapila during post-commit review of 857f9c36.

Author: Amit Kapila

src/backend/access/nbtree/nbtinsert.c
src/backend/access/nbtree/nbtpage.c
src/include/access/nbtree.h

index 3d5936f186e8c7b5cf6912ff51abf4caa3d250cc..907cce072412adf88d41ce9317a795fb25820be2 100644 (file)
@@ -2150,10 +2150,6 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
    metapg = BufferGetPage(metabuf);
    metad = BTPageGetMeta(metapg);
 
-   /* upgrade metapage if needed */
-   if (metad->btm_version < BTREE_VERSION)
-       _bt_upgrademetapage(metapg);
-
    /*
     * Create downlink item for left page (old root).  Since this will be the
     * first item in a non-leaf page, it implicitly has minus-infinity key
@@ -2178,6 +2174,10 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf)
    /* NO EREPORT(ERROR) from here till newroot op is logged */
    START_CRIT_SECTION();
 
+   /* upgrade metapage if needed */
+   if (metad->btm_version < BTREE_VERSION)
+       _bt_upgrademetapage(metapg);
+
    /* set btree special data */
    rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage);
    rootopaque->btpo_prev = rootopaque->btpo_next = P_NONE;
index 22b4a7578f3e015f6d3f2f03257cad5ba43881eb..a24e64156ab05c5a280587578ec06e21fad6572e 100644 (file)
@@ -341,10 +341,6 @@ _bt_getroot(Relation rel, int access)
        LockBuffer(metabuf, BUFFER_LOCK_UNLOCK);
        LockBuffer(metabuf, BT_WRITE);
 
-       /* upgrade metapage if needed */
-       if (metad->btm_version < BTREE_VERSION)
-           _bt_upgrademetapage(metapg);
-
        /*
         * Race condition:  if someone else initialized the metadata between
         * the time we released the read lock and acquired the write lock, we
@@ -379,6 +375,10 @@ _bt_getroot(Relation rel, int access)
        /* NO ELOG(ERROR) till meta is updated */
        START_CRIT_SECTION();
 
+       /* upgrade metapage if needed */
+       if (metad->btm_version < BTREE_VERSION)
+           _bt_upgrademetapage(metapg);
+
        metad->btm_root = rootblkno;
        metad->btm_level = 0;
        metad->btm_fastroot = rootblkno;
index 15a7b4c212e37130fe2ccfcc86b47dd91546099b..04ecb4cbc0f583dae04970d5a792283e1fe171f1 100644 (file)
@@ -103,7 +103,7 @@ typedef struct BTMetaPageData
    BlockNumber btm_fastroot;   /* current "fast" root location */
    uint32      btm_fastlevel;  /* tree level of the "fast" root page */
    /* following fields are available since page version 3 */
-   TransactionId btm_oldest_btpo_xact; /* oldest btpo_xact among of deleted
+   TransactionId btm_oldest_btpo_xact; /* oldest btpo_xact among all deleted
                                         * pages */
    float8      btm_last_cleanup_num_heap_tuples;   /* number of heap tuples
                                                     * during last cleanup */