]> granicus.if.org Git - postgresql/commitdiff
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 */